mindspore lite: add new files of framework
This commit is contained in:
parent
b87d3a66ca
commit
c9abde573c
|
@ -12,6 +12,7 @@ else()
|
|||
endif()
|
||||
set(TEST_CASE_DIR ${TOP_DIR}/mindspore/lite/test/build)
|
||||
set(EXTENDRT_BUILD_DIR ${TOP_DIR}/mindspore/lite/build/src/extendrt)
|
||||
set(EXECUTOR_BUILD_DIR ${TOP_DIR}/mindspore/lite/build/src/extendrt/unified_executor)
|
||||
|
||||
set(RUNTIME_DIR ${RUNTIME_PKG_NAME}/runtime)
|
||||
set(RUNTIME_INC_DIR ${RUNTIME_PKG_NAME}/runtime/include)
|
||||
|
@ -26,6 +27,7 @@ set(MINDSPORE_LITE_LIB_NAME libmindspore-lite)
|
|||
set(MINDSPORE_LITE_EXTENDRT_LIB_NAME libmindspore-lite)
|
||||
set(MINDSPORE_CORE_LIB_NAME libmindspore_core)
|
||||
set(MINDSPORE_GE_LITERT_LIB_NAME libmsplugin-ge-litert)
|
||||
set(MINDSPORE_LITE_EXECUTOR_LIB_NAME liblite-unified-executor)
|
||||
set(BENCHMARK_NAME benchmark)
|
||||
set(MSLITE_NNIE_LIB_NAME libmslite_nnie)
|
||||
set(MSLITE_PROPOSAL_LIB_NAME libmslite_proposal)
|
||||
|
@ -424,6 +426,8 @@ if(PLATFORM_ARM64)
|
|||
DESTINATION ${RUNTIME_LIB_DIR} COMPONENT ${RUNTIME_COMPONENT_NAME})
|
||||
install(FILES ${EXTENDRT_BUILD_DIR}/delegate/graph_executor/litert/${MINDSPORE_GE_LITERT_LIB_NAME}.so
|
||||
DESTINATION ${RUNTIME_LIB_DIR} COMPONENT ${RUNTIME_COMPONENT_NAME})
|
||||
install(FILES ${EXECUTOR_BUILD_DIR}/${MINDSPORE_LITE_EXECUTOR_LIB_NAME}.so
|
||||
DESTINATION ${RUNTIME_LIB_DIR} COMPONENT ${RUNTIME_COMPONENT_NAME})
|
||||
install(FILES ${glog_LIBPATH}/libmindspore_glog.so.0.4.0 DESTINATION ${RUNTIME_LIB_DIR}
|
||||
RENAME libmindspore_glog.so.0 COMPONENT ${RUNTIME_COMPONENT_NAME})
|
||||
install(TARGETS mindspore_core DESTINATION ${RUNTIME_LIB_DIR} COMPONENT ${RUNTIME_COMPONENT_NAME})
|
||||
|
@ -649,6 +653,8 @@ elseif(PLATFORM_ARM32)
|
|||
DESTINATION ${RUNTIME_LIB_DIR} COMPONENT ${RUNTIME_COMPONENT_NAME})
|
||||
install(FILES ${EXTENDRT_BUILD_DIR}/delegate/graph_executor/litert/${MINDSPORE_GE_LITERT_LIB_NAME}.so
|
||||
DESTINATION ${RUNTIME_LIB_DIR} COMPONENT ${RUNTIME_COMPONENT_NAME})
|
||||
install(FILES ${EXECUTOR_BUILD_DIR}/${MINDSPORE_LITE_EXECUTOR_LIB_NAME}.so
|
||||
DESTINATION ${RUNTIME_LIB_DIR} COMPONENT ${RUNTIME_COMPONENT_NAME})
|
||||
install(FILES ${glog_LIBPATH}/libmindspore_glog.so.0.4.0 DESTINATION ${RUNTIME_LIB_DIR}
|
||||
RENAME libmindspore_glog.so.0 COMPONENT ${RUNTIME_COMPONENT_NAME})
|
||||
install(TARGETS mindspore_core DESTINATION ${RUNTIME_LIB_DIR} COMPONENT ${RUNTIME_COMPONENT_NAME})
|
||||
|
@ -843,6 +849,8 @@ else()
|
|||
DESTINATION ${RUNTIME_LIB_DIR} COMPONENT ${RUNTIME_COMPONENT_NAME})
|
||||
install(FILES ${EXTENDRT_BUILD_DIR}/delegate/graph_executor/litert/${MINDSPORE_GE_LITERT_LIB_NAME}.so
|
||||
DESTINATION ${RUNTIME_LIB_DIR} COMPONENT ${RUNTIME_COMPONENT_NAME})
|
||||
install(FILES ${EXECUTOR_BUILD_DIR}/${MINDSPORE_LITE_EXECUTOR_LIB_NAME}.so
|
||||
DESTINATION ${RUNTIME_LIB_DIR} COMPONENT ${RUNTIME_COMPONENT_NAME})
|
||||
install(FILES ${glog_LIBPATH}/libmindspore_glog.so.0.4.0 DESTINATION ${RUNTIME_LIB_DIR}
|
||||
RENAME libmindspore_glog.so.0 COMPONENT ${RUNTIME_COMPONENT_NAME})
|
||||
install(FILES ${onednn_LIBPATH}/libdnnl.so.2.2 DESTINATION ${DNNL_DIR}
|
||||
|
|
|
@ -213,6 +213,7 @@ build_python_wheel_package() {
|
|||
if [[ ("${MSLITE_ENABLE_CLOUD_FUSION_INFERENCE}" == "on") || ("${MSLITE_ENABLE_CLOUD_INFERENCE}" == "on") ]]; then
|
||||
cp src/extendrt/*.so package/mindspore_lite/lib/
|
||||
find src/extendrt/delegate/graph_executor/litert/ -name "*.so" -exec cp '{}' package/mindspore_lite/lib/ \;
|
||||
find src/extendrt/unified_executor/ -name "*.so" -exec cp '{}' package/mindspore_lite/lib/ \;
|
||||
find src/extendrt/convert/ -name "*.so" -exec cp '{}' package/mindspore_lite/lib/ \;
|
||||
if [[ "${MSLITE_ENABLE_ACL}" ]]; then
|
||||
cp src/extendrt/kernel/ascend/*.so package/mindspore_lite/lib/
|
||||
|
|
|
@ -0,0 +1,388 @@
|
|||
set(API_SRC "")
|
||||
set(LITE_SRC "")
|
||||
|
||||
add_compile_definitions(ENABLE_LITE_HELPER)
|
||||
|
||||
set(MOCK_SRC
|
||||
${MOCK_SRC}
|
||||
${LITE_DIR}/src/extendrt/mock/lite_runtime/converters.cc
|
||||
${LITE_DIR}/src/extendrt/mock/lite_runtime/populate/base_operator_populate_register.cc
|
||||
${LITE_DIR}/src/extendrt/mock/lite_runtime/populate/arithmetic_populate.cc
|
||||
)
|
||||
|
||||
set(LITE_SRC
|
||||
${LITE_SRC}
|
||||
${API_SRC}
|
||||
${MOCK_SRC}
|
||||
${LITE_DIR}/src/common/context_util.cc
|
||||
${LITE_DIR}/src/common/file_utils.cc
|
||||
${LITE_DIR}/src/common/utils.cc
|
||||
${LITE_DIR}/src/common/graph_util.cc
|
||||
${LITE_DIR}/src/common/log.cc
|
||||
${LITE_DIR}/src/common/prim_util.cc
|
||||
${LITE_DIR}/src/common/tensor_util.cc
|
||||
${LITE_DIR}/src/common/config_infos.cc
|
||||
${LITE_DIR}/src/litert/allocator.cc
|
||||
${LITE_DIR}/src/litert/inner_allocator.cc
|
||||
${LITE_DIR}/src/litert/runtime_allocator.cc
|
||||
${LITE_DIR}/src/litert/infer_manager.cc
|
||||
${LITE_DIR}/src/litert/runtime_shape_fusion_pass.cc
|
||||
${LITE_DIR}/src/litert/runtime_pass.cc
|
||||
# ${LITE_DIR}/src/litert/pass/runtime_ncx_pass.cc
|
||||
${LITE_DIR}/src/litert/schema_tensor_wrapper.cc
|
||||
${LITE_DIR}/src/tensor.cc
|
||||
${LITE_DIR}/src/tensorlist.cc
|
||||
${LITE_DIR}/src/litert/tensor_category.cc
|
||||
${LITE_DIR}/src/litert/executor.cc
|
||||
${LITE_DIR}/src/litert/inner_context.cc
|
||||
${LITE_DIR}/src/litert/lite_model.cc
|
||||
${LITE_DIR}/src/litert/kernel_registry.cc
|
||||
${LITE_DIR}/src/litert/lite_kernel.cc
|
||||
${LITE_DIR}/src/litert/kernel_exec.cc
|
||||
${LITE_DIR}/src/litert/kernel_exec_util.cc
|
||||
${LITE_DIR}/src/litert/sub_graph_kernel.cc
|
||||
${LITE_DIR}/src/litert/scheduler.cc
|
||||
${LITE_DIR}/src/litert/lite_session.cc
|
||||
${LITE_DIR}/src/errorcode.cc
|
||||
${LITE_DIR}/src/litert/cpu_info.cc
|
||||
${LITE_DIR}/src/litert/pack_weight_manager.cc
|
||||
${LITE_DIR}/src/control_flow/control_flow_scheduler.cc
|
||||
${LITE_DIR}/src/control_flow/control_subgraph_creator.cc
|
||||
${LITE_DIR}/src/extendrt/utils/tensor_utils.cc
|
||||
)
|
||||
|
||||
set(MODEL_LOADER_FRAMEWORK_SRC
|
||||
${LITE_DIR}/src/extendrt/mindir_loader/model_loader.cc
|
||||
)
|
||||
|
||||
set(MINDIR_MODEL_SRC
|
||||
${MINDIR_MODEL_SRC}
|
||||
${LITE_DIR}/src/extendrt/mindir_loader/mindir_model/mindir_model.cc
|
||||
${LITE_DIR}/src/extendrt/mindir_loader/mindir_model/mindir_model_util.cc
|
||||
${LITE_DIR}/src/extendrt/mindir_loader/mindir_model/mindir_model_convertor.cc
|
||||
${LITE_DIR}/src/extendrt/mindir_loader/mindir_model/mindir_model_loader.cc
|
||||
${LITE_DIR}/src/extendrt/mindir_loader/mindir_model/kernel_mod_util.cc
|
||||
)
|
||||
|
||||
set(MINDIR_KERNEL_SRC
|
||||
${MINDIR_KERNEL_SRC}
|
||||
${LITE_DIR}/src/extendrt/mindir_loader/mindir_model/inner_kernel.cc)
|
||||
|
||||
set(LITE_SRC
|
||||
${LITE_SRC}
|
||||
${MODEL_LOADER_FRAMEWORK_SRC}
|
||||
${MINDIR_MODEL_SRC}
|
||||
${MINDIR_KERNEL_SRC}
|
||||
)
|
||||
|
||||
set(INFER_HELPER_SRC
|
||||
${INFER_HELPER_SRC}
|
||||
${LITE_DIR}/src/common/helper/external_tensor/file_helper.cc
|
||||
${LITE_DIR}/src/common/helper/external_tensor/memory_helper.cc
|
||||
)
|
||||
|
||||
set(LITE_SRC
|
||||
${LITE_SRC}
|
||||
${INFER_HELPER_SRC}
|
||||
)
|
||||
|
||||
if(MSLITE_ENABLE_MODEL_ENCRYPTION)
|
||||
set(LITE_SRC
|
||||
${LITE_SRC}
|
||||
${LITE_DIR}/src/common/decrypt.cc
|
||||
${LITE_DIR}/src/common/dynamic_library_loader.cc
|
||||
)
|
||||
endif()
|
||||
|
||||
if(MSLITE_ENABLE_BFC_MEMORY)
|
||||
set(LITE_SRC
|
||||
${LITE_SRC}
|
||||
${LITE_DIR}/src/extendrt/dynamic_mem_allocator.cc
|
||||
${LITE_DIR}/src/extendrt/dynamic_mem_manager.cc
|
||||
${LITE_DIR}/src/extendrt/numa_adapter.cc
|
||||
)
|
||||
endif()
|
||||
|
||||
if(MSLITE_ENABLE_SHARING_MODEL_WEIGHT)
|
||||
set(LITE_SRC
|
||||
${LITE_SRC}
|
||||
${LITE_DIR}/src/litert/pack_weight.cc
|
||||
)
|
||||
endif()
|
||||
|
||||
if(MSLITE_ENABLE_DYNAMIC_THREAD_DISTRIBUTE)
|
||||
set(LITE_SRC
|
||||
${LITE_SRC}
|
||||
${LITE_DIR}/src/litert/thread_cost_model.cc
|
||||
)
|
||||
endif()
|
||||
|
||||
if(MSLITE_ENABLE_CONTROLFLOW)
|
||||
file(GLOB CONTROL_FLOW_KERNEL_SRC
|
||||
${LITE_DIR}/src/control_flow/kernel/*.cc
|
||||
)
|
||||
set(LITE_SRC ${LITE_SRC} ${CONTROL_FLOW_KERNEL_SRC})
|
||||
endif()
|
||||
|
||||
if(MSLITE_ENABLE_RUNTIME_GLOG)
|
||||
if(NOT MSLITE_ENABLE_RUNTIME_CONVERT AND NOT MSLITE_ENABLE_KERNEL_EXECUTOR
|
||||
AND NOT (MSLITE_ENABLE_CLOUD_FUSION_INFERENCE OR MSLITE_ENABLE_CLOUD_INFERENCE))
|
||||
set(LITE_SRC ${LITE_SRC}
|
||||
${CORE_DIR}/utils/log_adapter.cc)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(MSLITE_ENABLE_RUNTIME_CONVERT)
|
||||
file(GLOB RUNTIME_CONVERT_SRC
|
||||
${LITE_DIR}/src/common/ops/ops_def.cc
|
||||
${LITE_DIR}/src/common/ops/ops_utils.cc
|
||||
${LITE_DIR}/src/common/ops/anf_utils.cc
|
||||
${LITE_DIR}/src/litert/runtime_convert.cc)
|
||||
set(LITE_SRC ${LITE_SRC} ${RUNTIME_CONVERT_SRC})
|
||||
endif()
|
||||
|
||||
if(MSLITE_ENABLE_STRING_KERNEL)
|
||||
set(LITE_SRC
|
||||
${LITE_SRC}
|
||||
${LITE_DIR}/src/common/string_util.cc
|
||||
)
|
||||
endif()
|
||||
|
||||
if(ENABLE_RUNTIME_NCX_PASS)
|
||||
file(GLOB RUNTIME_NCX_PASS_SRC
|
||||
${LITE_DIR}/src/litert/pass/decrease_transpose_algo.cc
|
||||
${LITE_DIR}/src/litert/pass/delete_isolated_kernel.cc
|
||||
${LITE_DIR}/src/litert/pass/infershape_pass.cc
|
||||
${LITE_DIR}/src/litert/pass/pass_utils.cc
|
||||
${LITE_DIR}/src/litert/pass/runtime_optimizer.cc
|
||||
${LITE_DIR}/src/litert/pass/to_nchw_format.cc
|
||||
${LITE_DIR}/src/litert/pass/transpose_strategy.cc
|
||||
)
|
||||
set(LITE_SRC ${LITE_SRC} ${RUNTIME_NCX_PASS_SRC})
|
||||
endif()
|
||||
|
||||
if(MSLITE_ENABLE_WEIGHT_DECODE)
|
||||
set(LITE_SRC ${LITE_SRC}
|
||||
${LITE_DIR}/src/litert/huffman_decode.cc)
|
||||
if(NOT MSLITE_ENABLE_RUNTIME_CONVERT)
|
||||
set(LITE_SRC ${LITE_SRC}
|
||||
${TOOLS_DIR}/converter/quantizer/fse_decoder.cc
|
||||
${TOOLS_DIR}/converter/quantizer/fse_bit_stream.cc)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(MSLITE_ENABLE_RUNTIME_PASS)
|
||||
file(GLOB KERNEL_ONLINE_FUSION_SRC ${LITE_DIR}/src/litert/pass/online_fusion/*.cc)
|
||||
set(LITE_SRC
|
||||
${LITE_SRC}
|
||||
${KERNEL_ONLINE_FUSION_SRC}
|
||||
${LITE_DIR}/src/litert/sub_graph_split.cc
|
||||
)
|
||||
endif()
|
||||
|
||||
if(MSLITE_ENABLE_AUTO_PARALLEL)
|
||||
set(LITE_SRC
|
||||
${LITE_SRC}
|
||||
${LITE_DIR}/src/litert/sub_graph_split.cc
|
||||
)
|
||||
endif()
|
||||
|
||||
if(MSLITE_ENABLE_CUSTOM_KERNEL)
|
||||
file(GLOB KERNEL_REG_SRC ${LITE_DIR}/src/registry/*.cc)
|
||||
endif()
|
||||
|
||||
set(LITE_SRC
|
||||
${LITE_SRC}
|
||||
${KERNEL_REG_SRC}
|
||||
${LITE_DIR}/src/litert/weight_decoder.cc
|
||||
)
|
||||
|
||||
if(MSLITE_GPU_BACKEND STREQUAL opencl)
|
||||
file(GLOB_RECURSE OPENCL_RUNTIME_SRC
|
||||
${LITE_DIR}/src/litert/kernel/gpu/opencl/*.cc
|
||||
)
|
||||
set(LITE_SRC
|
||||
${LITE_SRC}
|
||||
${OPENCL_RUNTIME_SRC}
|
||||
)
|
||||
endif()
|
||||
|
||||
if(MSLITE_GPU_BACKEND STREQUAL cuda)
|
||||
file(GLOB CUDA_RUNTIME_SRC
|
||||
${LITE_DIR}/src/litert/gpu/*.cc
|
||||
${LITE_DIR}/src/litert/gpu/cuda/*.cc
|
||||
)
|
||||
set(LITE_SRC
|
||||
${LITE_SRC}
|
||||
${CUDA_RUNTIME_SRC}
|
||||
)
|
||||
endif()
|
||||
if(MSLITE_MINDDATA_IMPLEMENT STREQUAL "full")
|
||||
set(TRAIN_SRC_WITH_MD
|
||||
${LITE_DIR}/src/train/train_loop.cc
|
||||
)
|
||||
endif()
|
||||
|
||||
|
||||
file(GLOB CXX_API_EXPRESSION
|
||||
${LITE_DIR}/src/litert/cxx_api/expression/*.cc
|
||||
)
|
||||
|
||||
file(GLOB EXPRESSION_OPS
|
||||
${LITE_DIR}/src/expression/ops/*.cc
|
||||
)
|
||||
|
||||
set(EXPRESSION_SRC
|
||||
${CXX_API_EXPRESSION}
|
||||
${LITE_DIR}/src/expression/export.cc
|
||||
${LITE_DIR}/src/expression/expr.cc
|
||||
${LITE_DIR}/src/expression/import.cc
|
||||
${LITE_DIR}/src/expression/net.cc
|
||||
${LITE_DIR}/src/expression/node.cc
|
||||
${LITE_DIR}/src/expression/ops.cc
|
||||
${LITE_DIR}/src/expression/ops_utils.cc
|
||||
${LITE_DIR}/src/expression/param.cc
|
||||
${LITE_DIR}/src/expression/sequential.cc
|
||||
${EXPRESSION_OPS}
|
||||
)
|
||||
|
||||
set(TRAIN_SRC
|
||||
${API_TRAIN_SRC}
|
||||
${TRAIN_SRC_WITH_MD}
|
||||
${EXPRESSION_SRC}
|
||||
${LITE_DIR}/src/common/quant_utils.cc
|
||||
${LITE_DIR}/src/litert/cxx_api/metrics/accuracy.cc
|
||||
${LITE_DIR}/src/litert/cxx_api/train/model_build.cc
|
||||
${LITE_DIR}/src/litert/cxx_api/train/model_build_impl.cc
|
||||
${LITE_DIR}/src/litert/cxx_api/train/converters.cc
|
||||
${LITE_DIR}/src/litert/cxx_api/train/train_support.cc
|
||||
${LITE_DIR}/src/train/train_populate_parameter.cc
|
||||
${LITE_DIR}/src/train/train_session.cc
|
||||
${LITE_DIR}/src/train/graph_fusion.cc
|
||||
${LITE_DIR}/src/train/graph_dropout.cc
|
||||
${LITE_DIR}/src/train/transfer_session.cc
|
||||
${LITE_DIR}/src/train/train_utils.cc
|
||||
${LITE_DIR}/src/train/loss_monitor.cc
|
||||
${LITE_DIR}/src/train/lr_scheduler.cc
|
||||
${LITE_DIR}/src/train/accuracy_metrics.cc
|
||||
${LITE_DIR}/src/train/accuracy_monitor.cc
|
||||
${LITE_DIR}/src/train/classification_train_accuracy_monitor.cc
|
||||
${LITE_DIR}/src/train/train_export.cc
|
||||
${LITE_DIR}/src/train/opt_allocator.cc
|
||||
${LITE_DIR}/src/common/storage.cc
|
||||
${TOOLS_DIR}/converter/optimizer.cc
|
||||
${TOOLS_DIR}/converter/legacy_optimizer/fusion/fusion_pass.cc
|
||||
${TOOLS_DIR}/converter/legacy_optimizer/fusion/fusion_pattern.cc
|
||||
${TOOLS_DIR}/common/meta_graph_utils.cc
|
||||
${TOOLS_DIR}/converter/legacy_optimizer/fusion/matmul_biasadd_fusion_pass.cc
|
||||
${TOOLS_DIR}/converter/legacy_optimizer/graph/dropout_node_remove_pass.cc
|
||||
${TOOLS_DIR}/converter/legacy_optimizer/graph/isolated_node_remove_pass.cc
|
||||
${TOOLS_DIR}/converter/legacy_optimizer/graph/subgraph_node_pass.cc
|
||||
)
|
||||
|
||||
if(MSLITE_ENABLE_MINDRT)
|
||||
set(LITE_SRC ${LITE_SRC}
|
||||
${LITE_DIR}/src/litert/lite_mindrt.cc
|
||||
${LITE_DIR}/src/litert/mindrt_executor.cc
|
||||
${LITE_DIR}/src/control_flow/control_actor_creator.cc
|
||||
)
|
||||
if(MSLITE_ENABLE_CONTROLFLOW)
|
||||
file(GLOB CONTROL_FLOW_ACTOR_SRC
|
||||
${LITE_DIR}/src/control_flow/actor/*.cc
|
||||
)
|
||||
set(LITE_SRC ${LITE_SRC} ${CONTROL_FLOW_ACTOR_SRC})
|
||||
endif()
|
||||
else()
|
||||
set(LITE_SRC ${LITE_SRC}
|
||||
${CORE_DIR}/mindrt/src/thread/core_affinity.cc
|
||||
${CORE_DIR}/mindrt/src/thread/threadpool.cc
|
||||
)
|
||||
endif()
|
||||
|
||||
if(MSLITE_ENABLE_GRAPH_KERNEL)
|
||||
file(GLOB_RECURSE GRAPH_KERNEL_SRC
|
||||
${TOOLS_DIR}/graph_kernel/common/*.cc
|
||||
${TOOLS_DIR}/graph_kernel/runtime/*.cc
|
||||
)
|
||||
set(LITE_SRC ${LITE_SRC} ${GRAPH_KERNEL_SRC})
|
||||
endif()
|
||||
|
||||
if(NOT MSLITE_ENABLE_COREML)
|
||||
set(LITE_SRC ${LITE_SRC}
|
||||
${LITE_DIR}/src/litert/delegate/coreml/stub/coreml_delegate_stub.cc)
|
||||
endif()
|
||||
|
||||
set(MSLITE_GE_LITERT_SRC
|
||||
${MSLITE_GE_LITERT_SRC}
|
||||
${LITE_DIR}/src/extendrt/delegate/graph_executor/litert/graph_executor.cc
|
||||
${LITE_DIR}/src/extendrt/delegate/graph_executor/litert/litert_plugin_impl.cc
|
||||
)
|
||||
|
||||
set(LITE_SRC ${LITE_SRC} ${MSLITE_GE_LITERT_SRC})
|
||||
|
||||
add_library(unified_runtime_lite_src_mid OBJECT ${LITE_SRC})
|
||||
add_dependencies(unified_runtime_lite_src_mid fbs_src)
|
||||
|
||||
add_library(lite-unified-executor SHARED $<TARGET_OBJECTS:unified_runtime_lite_src_mid>)
|
||||
|
||||
add_dependencies(lite-unified-executor mindspore_converter)
|
||||
target_link_libraries(lite-unified-executor mindspore_converter)
|
||||
|
||||
if(MSVC)
|
||||
set_target_properties(lite-unified-executor PROPERTIES PREFIX lib)
|
||||
set_target_properties(lite-unified-executor PROPERTIES IMPORT_PREFIX lib)
|
||||
set_target_properties(lite-unified-executor PROPERTIES IMPORT_SUFFIX .dll.lib)
|
||||
endif()
|
||||
|
||||
target_link_libraries(lite-unified-executor cpu_kernel_mid nnacl_mid cpu_ops_mid)
|
||||
|
||||
if(SUPPORT_TRAIN)
|
||||
target_link_libraries(lite-unified-executor train_cpu_kernel_mid)
|
||||
endif()
|
||||
|
||||
if(MSLITE_ENABLE_MINDRT)
|
||||
target_link_libraries(lite-unified-executor mindrt_mid)
|
||||
endif()
|
||||
|
||||
if(PLATFORM_ARM32 OR PLATFORM_ARM64 AND NOT TARGET_HIMIX
|
||||
AND NOT TARGET_MIX210 AND NOT TARGET_OHOS_LITE AND NOT MACHINE_LINUX_ARM64)
|
||||
target_link_libraries(lite-unified-executor log)
|
||||
endif()
|
||||
if(MSLITE_MINDDATA_IMPLEMENT STREQUAL "lite")
|
||||
target_link_libraries(lite-unified-executor minddata_eager_mid minddata-lite)
|
||||
endif()
|
||||
|
||||
########################## build optimize and float16 library #################################
|
||||
if(PLATFORM_ARM)
|
||||
if(PLATFORM_ARM64 AND NOT TARGET_HIMIX AND NOT TARGET_MIX210 AND NOT MACHINE_LINUX_ARM64)
|
||||
target_link_libraries(lite-unified-executor cpu_opt_kernel_mid nnacl_optimize_mid)
|
||||
endif()
|
||||
if(MSLITE_ENABLE_FP16)
|
||||
target_link_libraries(lite-unified-executor cpu_fp16_kernel_mid nnacl_fp16_mid)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(MSLITE_ENABLE_RUNTIME_CONVERT)
|
||||
target_link_libraries(lite-unified-executor
|
||||
quantizer_mid fusion_mid proto_mid graph_pass_mid preprocess_mid
|
||||
cpu_kernel_mid ccsrc_src_mid converter_src_mid lite_exporter_mid
|
||||
config_parser_mid mslite_converter_plugin mindspore_core coder_mid
|
||||
mindir_serializer_mid mindspore::protobuf ${SECUREC_LIBRARY})
|
||||
target_link_libraries(lite-unified-executor
|
||||
ccsrc_debug_common_mid_ mindir_proto_mid _mindspore_transform_express_ir_obj)
|
||||
endif()
|
||||
|
||||
|
||||
target_link_libraries(lite-unified-executor mindspore::protobuf)
|
||||
|
||||
if(MSLITE_ENABLE_RUNTIME_GLOG)
|
||||
target_link_libraries(lite-unified-executor mindspore::glog)
|
||||
endif()
|
||||
|
||||
if(NOT WIN32)
|
||||
target_link_libraries(lite-unified-executor dl)
|
||||
endif()
|
||||
|
||||
if(ENABLE_MODEL_OBF)
|
||||
target_link_libraries(lite-unified-executor ${OBF_LIB_DIR}/libmsdeobfuscator-lite.so)
|
||||
endif()
|
|
@ -35,7 +35,7 @@ if(MSLITE_ENABLE_CLOUD_FUSION_INFERENCE OR MSLITE_ENABLE_CLOUD_INFERENCE)
|
|||
${CMAKE_CURRENT_SOURCE_DIR}/infer_session.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/session/single_op_session.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/session/delegate_session.cc
|
||||
# ${CMAKE_CURRENT_SOURCE_DIR}/session/default_session.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/session/default_session.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/session/factory.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/infer_device_address.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/utils/kernel_build_utils.cc
|
||||
|
@ -52,8 +52,14 @@ if(MSLITE_ENABLE_CLOUD_FUSION_INFERENCE OR MSLITE_ENABLE_CLOUD_INFERENCE)
|
|||
${CMAKE_CURRENT_SOURCE_DIR}/delegate_graph_executor.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/session/optimizer/tensorrt_optimizer.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/delegate/graph_executor/litert/func_graph_reuse_manager.cc
|
||||
# ${CMAKE_CURRENT_SOURCE_DIR}/graph_compiler/factory.cc
|
||||
# ${CMAKE_CURRENT_SOURCE_DIR}/graph_runtime/factory.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/graph_compiler/factory.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/graph_compiler/default_graph_compiler.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/graph_runtime/factory.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/graph_runtime/default_graph_runtime.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/graph_executor/factory.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/graph_executor/mindrt_graph_executor.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/execution_flow.cc
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/execution_plan.cc
|
||||
)
|
||||
if(MSLITE_ENABLE_BFC_MEMORY)
|
||||
set(MSLITE_EXTEND_RUNTIME_SRC ${MSLITE_EXTEND_RUNTIME_SRC}
|
||||
|
@ -163,6 +169,12 @@ if(MSLITE_ENABLE_CLOUD_FUSION_INFERENCE OR MSLITE_ENABLE_CLOUD_INFERENCE)
|
|||
add_dependencies(mindspore-extendrt_static msplugin-ge-litert)
|
||||
target_link_libraries(mindspore-extendrt_static msplugin-ge-litert)
|
||||
|
||||
add_subdirectory(${LITE_DIR}/src/executor unified_executor)
|
||||
|
||||
add_dependencies(mindspore-extendrt lite-unified-executor)
|
||||
target_link_libraries(mindspore-extendrt lite-unified-executor)
|
||||
target_link_libraries(mindspore-extendrt_static lite-unified-executor)
|
||||
|
||||
if(NOT PLATFORM_ARM)
|
||||
set(KERNEL_MOD_DEPEND_SRC
|
||||
${CCSRC_DIR}/kernel/environ_manager.cc
|
||||
|
|
|
@ -42,22 +42,25 @@ ExecutionFlow::~ExecutionFlow() {
|
|||
}
|
||||
|
||||
abstract::Kernel *ExecutionFlow::ConstructFusionKernel() {
|
||||
auto lite_kernel = new (std::nothrow) mindspore::kernel::LiteKernel(nullptr, inputs_, outputs_, context_);
|
||||
auto lite_kernel = new (std::nothrow) mindspore::kernel::LiteKernel(nullptr, inputs_, outputs_, context_.get());
|
||||
if (lite_kernel == nullptr) {
|
||||
MS_LOG(ERROR) << "ExecutionFlow::ConstructFusionKernel create lite kernel failed, may be memory is not enough";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::vector<KernelExec *> input_kernels = mindspore::kernel::KernelExecUtil::SubgraphInputNodes(kernels_);
|
||||
std::vector<KernelExec *> output_kernels = mindspore::kernel::KernelExecUtil::SubgraphOutputNodes(kernels_);
|
||||
std::vector<mindspore::kernel::KernelExec *> input_kernels =
|
||||
mindspore::kernel::KernelExecUtil::SubgraphInputNodes(kernels_);
|
||||
std::vector<mindspore::kernel::KernelExec *> output_kernels =
|
||||
mindspore::kernel::KernelExecUtil::SubgraphOutputNodes(kernels_);
|
||||
|
||||
mindspore::kernel::SubGraphKernel *sub_graph_kernel =
|
||||
new CpuFp32SubGraph(input_kernels, output_kernels, kernels_, lite_kernel);
|
||||
new mindspore::kernel::CpuFp32SubGraph(input_kernels, output_kernels, kernels_, lite_kernel);
|
||||
if (sub_graph_kernel == nullptr) {
|
||||
MS_LOG(ERROR) << "ExecutionFlow::ConstructFusionKernel create sub graph kernel failed, may be memory is not enough";
|
||||
delete lite_kernel return nullptr;
|
||||
delete lite_kernel;
|
||||
return nullptr;
|
||||
}
|
||||
sub_graph_kernel->set_context(context_);
|
||||
sub_graph_kernel->set_context(context_.get());
|
||||
return sub_graph_kernel;
|
||||
}
|
||||
} // namespace mindspore::infer
|
||||
|
|
|
@ -67,13 +67,13 @@ class ExecutionPlan : public abstract::ExecutionPlan {
|
|||
input_isolate_map_ = input_isolate_map;
|
||||
}
|
||||
|
||||
std::unordered_map<abstract::Tensor *, abstract::Tensor *> *GetInputMap() { return input_isolate_map_; }
|
||||
std::unordered_map<abstract::Tensor *, abstract::Tensor *> *GetInputsMap() { return input_isolate_map_; }
|
||||
|
||||
void SetOutputsMap(std::unordered_map<abstract::Tensor *, abstract::Tensor *> *output_isolate_map) {
|
||||
output_isolate_map_ = output_isolate_map;
|
||||
}
|
||||
|
||||
std::unordered_map<abstract::Tensor *, abstract::Tensor *> *GetOutputMap() { return output_isolate_map_; }
|
||||
std::unordered_map<abstract::Tensor *, abstract::Tensor *> *GetOutputsMap() { return output_isolate_map_; }
|
||||
|
||||
std::vector<abstract::Kernel *> ToKernelList() override;
|
||||
|
||||
|
|
|
@ -16,14 +16,15 @@
|
|||
|
||||
#include <unordered_map>
|
||||
#include <algorithm>
|
||||
#include <utility>
|
||||
|
||||
#include "extendrt/graph_compiler/default_graph_compiler.h"
|
||||
#include "extendrt/graph_compiler/factory.h"
|
||||
|
||||
#include "extendrt/execution_plan.h"
|
||||
#include "extendrt/mock/lite_runtime/converters.h"
|
||||
#include "backend/graph_compiler/graph_partition.h"
|
||||
#include "backend/graph_compiler/segment_runner.h"
|
||||
#include "common/log.h"
|
||||
#include "ops/core_ops.h"
|
||||
#include "include/common/utils/utils.h"
|
||||
|
||||
namespace mindspore {
|
||||
static const std::vector<PrimitivePtr> ms_infer_cut_list = {prim::kPrimReturn, prim::kPrimPartial,
|
||||
|
@ -31,7 +32,7 @@ static const std::vector<PrimitivePtr> ms_infer_cut_list = {prim::kPrimReturn,
|
|||
prim::kPrimBpropCut, prim::kPrimSwitchLayer};
|
||||
static constexpr auto ms_infer_backend_name = "mindspore_lite_backend";
|
||||
|
||||
std::shared_ptr<abstract::ExecutionPlan> DefaultGraphCompiler::Compile(FuncGraphPtr graph) {
|
||||
std::shared_ptr<infer::abstract::ExecutionPlan> DefaultGraphCompiler::Compile(FuncGraphPtr graph) {
|
||||
MS_LOG(INFO) << "DefaultGraphCompiler::Compile";
|
||||
|
||||
inner_context_ = ContextUtils::Convert(context_.get());
|
||||
|
@ -45,7 +46,7 @@ std::shared_ptr<abstract::ExecutionPlan> DefaultGraphCompiler::Compile(FuncGraph
|
|||
MS_LOG(DEBUG) << "DefaultGraphCompiler::Partition Partition FunctionGraph End";
|
||||
|
||||
MS_LOG(DEBUG) << "DefaultGraphCompiler::Compile Schedule Graph Execute Plan Begin";
|
||||
auto execution_plan = Schedule(graph_segments);
|
||||
auto execution_plan = Schedule(graph_segments, graph);
|
||||
if (execution_plan == nullptr) {
|
||||
MS_LOG(ERROR) << "DefaultGraphCompiler::Partition partition graph failed";
|
||||
return nullptr;
|
||||
|
@ -55,7 +56,7 @@ std::shared_ptr<abstract::ExecutionPlan> DefaultGraphCompiler::Compile(FuncGraph
|
|||
}
|
||||
|
||||
std::vector<GraphSegmentPtr> DefaultGraphCompiler::Partition(const FuncGraphPtr &graph) {
|
||||
auto partition = std::make_shared<GraphPartition>(ms_infer_cut_list, ms_infer_backend_name);
|
||||
auto partition = std::make_shared<compile::GraphPartition>(ms_infer_cut_list, ms_infer_backend_name);
|
||||
if (partition == nullptr) {
|
||||
MS_LOG(ERROR) << "DefaultGraphCompiler::Partition create graph partition failed, maybe not enough memory";
|
||||
return std::vector<GraphSegmentPtr>();
|
||||
|
@ -64,25 +65,29 @@ std::vector<GraphSegmentPtr> DefaultGraphCompiler::Partition(const FuncGraphPtr
|
|||
// if the context target is cpu, graph should convert to NHWC, call related pass
|
||||
|
||||
// multi_target set false
|
||||
return partition->Partition(graph, false);
|
||||
bool is_multi_target;
|
||||
return partition->Partition(graph, &is_multi_target);
|
||||
}
|
||||
|
||||
std::shared_ptr<abstract::ExecutionPlan> DefaultGraphCompiler::Schedule(
|
||||
std::shared_ptr<infer::abstract::ExecutionPlan> DefaultGraphCompiler::Schedule(
|
||||
const std::vector<GraphSegmentPtr> &graph_segments, FuncGraphPtr func_graph) {
|
||||
auto execution_plan = std::make_shared<infer::ExecutionPlan>();
|
||||
anf_tensor_map_.clear();
|
||||
|
||||
std::unordered_map<Tensor *, Tensor *> *input_isolate_map = new std::unordered_map<Tensor *, Tensor *>();
|
||||
std::unordered_map<Tensor *, Tensor *> *output_isolate_map = new std::unordered_map<Tensor *, Tensor *>();
|
||||
std::unordered_map<infer::abstract::Tensor *, infer::abstract::Tensor *> *input_isolate_map =
|
||||
new std::unordered_map<infer::abstract::Tensor *, infer::abstract::Tensor *>();
|
||||
std::unordered_map<infer::abstract::Tensor *, infer::abstract::Tensor *> *output_isolate_map =
|
||||
new std::unordered_map<infer::abstract::Tensor *, infer::abstract::Tensor *>();
|
||||
|
||||
// Convert FuncGraph Input and Output AnfNode to Tensor and save in Execution Plan
|
||||
auto graph_inputs = func_grapn->get_inputs();
|
||||
auto graph_inputs = func_graph->get_inputs();
|
||||
if (graph_inputs.empty()) {
|
||||
MS_LOG(ERROR) << "DefaultGraphCompiler::Schedule get graph inputs node failed";
|
||||
delete input_isolate_map;
|
||||
delete output_isolate_map;
|
||||
return nullptr;
|
||||
}
|
||||
std::vector<AnfNodePtr> graph_outputs;
|
||||
auto graph_output = func_graph->output();
|
||||
if (graph_output == nullptr) {
|
||||
MS_LOG(ERROR) << "DefaultGraphCompiler::Schedule get graph output node failed";
|
||||
|
@ -90,6 +95,7 @@ std::shared_ptr<abstract::ExecutionPlan> DefaultGraphCompiler::Schedule(
|
|||
delete output_isolate_map;
|
||||
return nullptr;
|
||||
}
|
||||
graph_outputs.emplace_back(graph_output);
|
||||
auto graph_input_tensors = CreateTensors(graph_inputs);
|
||||
if (graph_input_tensors.size() != graph_inputs.size()) {
|
||||
MS_LOG(ERROR) << "DefaultGraphCompiler::Schedule create graph input tensors failed";
|
||||
|
@ -98,14 +104,14 @@ std::shared_ptr<abstract::ExecutionPlan> DefaultGraphCompiler::Schedule(
|
|||
return nullptr;
|
||||
}
|
||||
execution_plan->SetInputs(graph_input_tensors);
|
||||
auto graph_output_tensor = CreateTensor(graph_output);
|
||||
if (graph_output_tensor == nullptr) {
|
||||
auto graph_output_tensors = CreateTensors(graph_outputs);
|
||||
if (graph_output_tensors.size() != graph_outputs.size()) {
|
||||
MS_LOG(ERROR) << "DefaultGraphCompiler::Schedule create graph output tensor failed";
|
||||
delete input_isolate_map;
|
||||
delete output_isolate_map;
|
||||
return nullptr;
|
||||
}
|
||||
execution_plan->SetOutputs(graph_output_tensor);
|
||||
execution_plan->SetOutputs(graph_output_tensors);
|
||||
execution_plan->SetContext(inner_context_);
|
||||
|
||||
for (auto graph_segment : graph_segments) {
|
||||
|
@ -122,25 +128,25 @@ std::shared_ptr<abstract::ExecutionPlan> DefaultGraphCompiler::Schedule(
|
|||
}
|
||||
execution_flow->SetContext(inner_context_);
|
||||
|
||||
for (auto i = 0; i < execution_flow->GetInputs().size(); i++) {
|
||||
for (size_t i = 0; i < execution_flow->GetInputs().size(); i++) {
|
||||
auto input_tensor = execution_flow->GetInputs()[i];
|
||||
auto input_node = inputs[i];
|
||||
auto it = anf_tensor_map_.find(input_node);
|
||||
if (it != anf_tensor_map_.end()) {
|
||||
auto outter_tensor = it->second;
|
||||
input_isolate_map[input_tensor] = outter_tensor;
|
||||
(*input_isolate_map)[input_tensor] = outter_tensor;
|
||||
} else {
|
||||
anf_tensor_map_[input_node] = input_tensor;
|
||||
}
|
||||
}
|
||||
|
||||
for (auto i = 0; i < execution_flow->GetOutputs().size(); i++) {
|
||||
for (size_t i = 0; i < execution_flow->GetOutputs().size(); i++) {
|
||||
auto output_tensor = execution_flow->GetOutputs()[i];
|
||||
auto output_node = outputs[i];
|
||||
auto it = anf_tensor_map_.find(output_node);
|
||||
if (it != anf_tensor_map_.end()) {
|
||||
auto outter_tensor = it->second;
|
||||
output_isolate_map[output_tensor] = outter_tensor;
|
||||
(*output_isolate_map)[output_tensor] = outter_tensor;
|
||||
} else {
|
||||
anf_tensor_map_[output_node] = output_tensor;
|
||||
}
|
||||
|
@ -148,15 +154,15 @@ std::shared_ptr<abstract::ExecutionPlan> DefaultGraphCompiler::Schedule(
|
|||
|
||||
execution_plan->AddExecutionFlow(execution_flow);
|
||||
}
|
||||
execution_plan->SetInputMap(input_isolate_map);
|
||||
execution_plan->SetOutputMap(output_isolate_map);
|
||||
execution_plan->SetInputsMap(input_isolate_map);
|
||||
execution_plan->SetOutputsMap(output_isolate_map);
|
||||
|
||||
return execution_plan;
|
||||
}
|
||||
|
||||
infer::abstract::Tensor *DefaultGraphCompiler::CreateTensor(AnfNodePtr node) {
|
||||
if (node->isa<CNode>) {
|
||||
} else if (node->isa<Parameter>) {
|
||||
if (node->isa<CNode>()) {
|
||||
} else if (node->isa<Parameter>()) {
|
||||
auto parameter_node = node->cast<ParameterPtr>();
|
||||
if (parameter_node == nullptr) {
|
||||
MS_LOG(ERROR) << "parameter node is nullptr";
|
||||
|
@ -227,18 +233,142 @@ Status DefaultGraphCompiler::GetDTAndShapeFromAbTensor(const abstract::AbstractT
|
|||
std::vector<infer::abstract::Tensor *> DefaultGraphCompiler::CreateTensors(const std::vector<AnfNodePtr> &nodes) {
|
||||
std::vector<infer::abstract::Tensor *> tensors;
|
||||
std::transform(nodes.begin(), nodes.end(), std::back_inserter(tensors),
|
||||
[](AnfNodePtr node) { return CreateTensor(node); });
|
||||
[this](AnfNodePtr node) { return this->CreateTensor(node); });
|
||||
return tensors;
|
||||
}
|
||||
|
||||
std::shared_ptr<abstract::ExecutionFlow> DefaultGraphCompiler::Schedule(const GraphSegmentPtr &graph_segment,
|
||||
const std::vector<AnfNodePtr> &inputs,
|
||||
const std::vector<AnfNodePtr> &outputs) {
|
||||
std::tuple<FuncGraphPtr, AnfNodePtrList, AnfNodePtrList> DefaultGraphCompiler::TransformSegmentToAnfGraph(
|
||||
const AnfNodePtrList &lst) {
|
||||
if (lst.empty()) {
|
||||
MS_LOG(EXCEPTION) << "Input anf node list is empty";
|
||||
}
|
||||
FuncGraphPtr fg = nullptr;
|
||||
{
|
||||
// limit the lifetime of guard.
|
||||
MS_EXCEPTION_IF_NULL(lst[0]->cast<CNodePtr>());
|
||||
MS_EXCEPTION_IF_NULL(lst[0]->cast<CNodePtr>()->func_graph());
|
||||
TraceGuard guard(std::make_shared<TraceSegmentTransform>(lst[0]->cast<CNodePtr>()->func_graph()->debug_info()));
|
||||
fg = std::make_shared<FuncGraph>();
|
||||
}
|
||||
AnfNodePtrList inputs;
|
||||
mindspore::HashMap<AnfNodePtr, AnfNodePtr> eqv;
|
||||
// Merge CNodes into a AnfGraph that represents a linear instruction segment
|
||||
for (auto n : lst) {
|
||||
MS_EXCEPTION_IF_NULL(n);
|
||||
if (!n->isa<CNode>()) {
|
||||
MS_LOG(EXCEPTION) << "Inst is not CNode";
|
||||
}
|
||||
auto &inps = n->cast<CNodePtr>()->inputs();
|
||||
if (inps.empty()) {
|
||||
MS_LOG(EXCEPTION) << "Input is empty";
|
||||
}
|
||||
if (!IsValueNode<Primitive>(inps[0]) &&
|
||||
!(IsValueNode<FuncGraph>(inps[0]) &&
|
||||
inps[0]->cast<ValueNodePtr>()->value()->cast<FuncGraphPtr>()->has_attr(FUNC_GRAPH_ATTR_GRAPH_KERNEL))) {
|
||||
MS_LOG(EXCEPTION) << "Input[0] must be a Primitive ValueNode";
|
||||
}
|
||||
auto fn = inps[0];
|
||||
std::vector<AnfNodePtr> args{fn};
|
||||
if (IsPrimitive(fn, prim::kPrimDepend) && inps.size() >= kDependInputSize &&
|
||||
eqv.find(inps[kDependAttachNodeIndex]) == eqv.end()) {
|
||||
args.emplace_back(RefSubGraphNode(fg, inps[kRealInputIndexInDepend], &inputs, &eqv));
|
||||
const size_t value_start_index = 2;
|
||||
for (size_t i = value_start_index; i < inps.size(); ++i) {
|
||||
args.emplace_back(NewValueNode(MakeValue(0)));
|
||||
}
|
||||
} else {
|
||||
(void)std::transform(
|
||||
std::begin(inps) + 1, std::end(inps), std::back_inserter(args),
|
||||
[&fg, &inputs, &eqv, this](const AnfNodePtr &a) { return this->RefSubGraphNode(fg, a, &inputs, &eqv); });
|
||||
}
|
||||
TraceGuard tg(std::make_shared<TraceSegmentTransform>(n->debug_info()));
|
||||
MS_EXCEPTION_IF_NULL(fg);
|
||||
eqv[n] = fg->NewCNode(args);
|
||||
eqv[n]->set_abstract(n->abstract());
|
||||
eqv[n]->set_kernel_info(n->kernel_info_ptr());
|
||||
}
|
||||
mindspore::HashSet<AnfNodePtr> eqv_keys;
|
||||
for (auto &e : eqv) {
|
||||
(void)eqv_keys.emplace(e.first);
|
||||
}
|
||||
auto mgr = lst[0]->func_graph()->manager();
|
||||
MS_EXCEPTION_IF_NULL(mgr);
|
||||
auto outputs = GetOutput(lst, mgr->node_users(), eqv_keys);
|
||||
AnfNodePtr fg_output;
|
||||
if (outputs.size() > 1) {
|
||||
std::vector<AnfNodePtr> output_args;
|
||||
output_args.push_back(NewValueNode(prim::kPrimMakeTuple));
|
||||
(void)std::transform(std::begin(outputs), std::end(outputs), std::back_inserter(output_args),
|
||||
[&eqv](const AnfNodePtr &o) -> AnfNodePtr { return eqv[o]; });
|
||||
// Set output for AnfGraph
|
||||
fg_output = fg->NewCNode(output_args);
|
||||
} else {
|
||||
if (outputs.empty()) {
|
||||
MS_LOG(EXCEPTION) << "Output is empty.";
|
||||
}
|
||||
fg_output = eqv[outputs[0]];
|
||||
}
|
||||
fg->set_output(fg_output);
|
||||
return std::make_tuple(fg, inputs, outputs);
|
||||
}
|
||||
|
||||
AnfNodePtrList DefaultGraphCompiler::GetOutput(const AnfNodePtrList &nodes, const NodeUsersMap &users,
|
||||
const mindspore::HashSet<AnfNodePtr> &seen) {
|
||||
AnfNodePtrList output;
|
||||
if (users.size() == 0) {
|
||||
return output;
|
||||
}
|
||||
for (auto &node : nodes) {
|
||||
MS_EXCEPTION_IF_NULL(node);
|
||||
if (!node->isa<CNode>()) {
|
||||
continue;
|
||||
}
|
||||
auto iter = users.find(node);
|
||||
if (iter == users.end()) {
|
||||
continue;
|
||||
}
|
||||
auto &node_users = iter->second;
|
||||
const bool has_outer_user = std::any_of(std::begin(node_users), std::end(node_users),
|
||||
[&seen](const std::pair<AnfNodePtr, int64_t> &u) -> bool {
|
||||
const bool is_outer_user = (seen.find(u.first) == seen.end());
|
||||
return is_outer_user;
|
||||
});
|
||||
if (has_outer_user) {
|
||||
output.emplace_back(node);
|
||||
}
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
AnfNodePtr DefaultGraphCompiler::RefSubGraphNode(const FuncGraphPtr &fg, const AnfNodePtr &node,
|
||||
AnfNodePtrList *inputs_ptr,
|
||||
mindspore::HashMap<AnfNodePtr, AnfNodePtr> *eqv_ptr) {
|
||||
MS_EXCEPTION_IF_NULL(fg);
|
||||
MS_EXCEPTION_IF_NULL(inputs_ptr);
|
||||
MS_EXCEPTION_IF_NULL(eqv_ptr);
|
||||
MS_EXCEPTION_IF_NULL(node);
|
||||
auto &inputs = *inputs_ptr;
|
||||
auto &eqv = *eqv_ptr;
|
||||
if (node->isa<ValueNode>() && !IsValueNode<FuncGraph>(node)) {
|
||||
eqv[node] = node;
|
||||
} else if (eqv.find(node) == eqv.end()) {
|
||||
inputs.push_back(node);
|
||||
eqv[node] = fg->add_parameter();
|
||||
eqv[node]->set_abstract(node->abstract());
|
||||
eqv[node]->set_kernel_info(node->kernel_info_ptr());
|
||||
}
|
||||
return eqv[node];
|
||||
}
|
||||
|
||||
std::shared_ptr<infer::abstract::ExecutionFlow> DefaultGraphCompiler::Schedule(const GraphSegmentPtr &graph_segment,
|
||||
const std::vector<AnfNodePtr> &inputs,
|
||||
const std::vector<AnfNodePtr> &outputs) {
|
||||
// implementation by hangangqiang
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static std::shared_ptr<InferSession> DefaultGraphCompilerCreator(const std::shared_ptr<Context> &ctx) {
|
||||
static std::shared_ptr<infer::abstract::GraphCompiler> DefaultGraphCompilerCreator(
|
||||
const std::shared_ptr<Context> &ctx) {
|
||||
auto graph_compiler = std::make_shared<DefaultGraphCompiler>(ctx);
|
||||
return graph_compiler;
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <tuple>
|
||||
|
||||
#include "infer/graph_compiler.h"
|
||||
#include "infer/context.h"
|
||||
|
@ -30,15 +31,15 @@ class DefaultGraphCompiler : public mindspore::infer::abstract::GraphCompiler {
|
|||
}
|
||||
virtual ~DefaultGraphCompiler() = default;
|
||||
|
||||
std::shared_ptr<abstract::ExecutionPlan> Compile(FuncGraphPtr graph) override;
|
||||
std::shared_ptr<infer::abstract::ExecutionPlan> Compile(FuncGraphPtr graph) override;
|
||||
|
||||
protected:
|
||||
virtual std::vector<GraphSegmentPtr> Partition(const FuncGraphPtr &graph);
|
||||
|
||||
virtual std::shared_ptr<abstract::ExecutionPlan> Schedule(const std::vector<GraphSegmentPtr> &graph_segments,
|
||||
virtual std::shared_ptr<infer::abstract::ExecutionPlan> Schedule(const std::vector<GraphSegmentPtr> &graph_segments,
|
||||
FuncGraphPtr func_graph);
|
||||
|
||||
virtual std::shared_ptr<abstract::ExecutionFlow> Schedule(const GraphSegmentPtr &graph_segment,
|
||||
virtual std::shared_ptr<infer::abstract::ExecutionFlow> Schedule(const GraphSegmentPtr &graph_segment,
|
||||
const std::vector<AnfNodePtr> &inputs,
|
||||
const std::vector<AnfNodePtr> &outputs);
|
||||
|
||||
|
@ -49,11 +50,17 @@ class DefaultGraphCompiler : public mindspore::infer::abstract::GraphCompiler {
|
|||
Status GetDTAndShapeFromAbTensor(const abstract::AbstractTensorPtr &abstract, TypeId *data_type,
|
||||
ShapeVector *shape_vector);
|
||||
|
||||
std::tuple<FuncGraphPtr, AnfNodePtrList, AnfNodePtrList> TransformSegmentToAnfGraph(const AnfNodePtrList &lst);
|
||||
AnfNodePtrList GetOutput(const AnfNodePtrList &nodes, const NodeUsersMap &users,
|
||||
const mindspore::HashSet<AnfNodePtr> &seen);
|
||||
AnfNodePtr RefSubGraphNode(const FuncGraphPtr &fg, const AnfNodePtr &node, AnfNodePtrList *inputs_ptr,
|
||||
mindspore::HashMap<AnfNodePtr, AnfNodePtr> *eqv_ptr);
|
||||
|
||||
private:
|
||||
mindspore::HashMap<AnfNodePtr, infer::abstract::Tensor *> anf_tensor_map_;
|
||||
const std::shared_ptr<Context> &context_;
|
||||
std::shared_ptr<mindspore::infer::abstract::Context> inner_context_;
|
||||
}
|
||||
};
|
||||
} // namespace mindspore
|
||||
|
||||
#endif // MINDSPORE_LITE_EXTENDRT_GRAPH_COMPILER_DEFAULT_GRAPH_COMPILER_H_
|
||||
|
|
|
@ -17,6 +17,6 @@
|
|||
#define MINDSPORE_LITE_EXTENDRT_GRAPH_COMIPLER_TYPE_H_
|
||||
|
||||
namespace mindspore {
|
||||
enum GraphCompilerType { kDefaultCompiler = 0, kSingleOpSession, kLiteInferSession, kDelegateSession, kNoneCompiler };
|
||||
enum GraphCompilerType { kDefaultCompiler = 0, kNoneCompiler };
|
||||
} // namespace mindspore
|
||||
#endif // MINDSPORE_LITE_EXTENDRT_GRAPH_COMIPLER_TYPE_H_
|
||||
|
|
|
@ -27,11 +27,13 @@ void GraphExecutorRegistry::RegExecutor(const mindspore::GraphExecutorType &type
|
|||
graph_executor_map_[type] = creator;
|
||||
}
|
||||
|
||||
std::shared_ptr<infer::GraphExecutor> GraphExecutorRegistry::GetExecutor(const mindspore::GraphExecutorType &type) {
|
||||
std::shared_ptr<infer::abstract::Executor> GraphExecutorRegistry::GetExecutor(
|
||||
const mindspore::GraphExecutorType &type, const std::string &name,
|
||||
std::shared_ptr<infer::abstract::ExecutionPlan> execution_plan) {
|
||||
auto it = graph_executor_map_.find(type);
|
||||
if (it == graph_executor_map_.end()) {
|
||||
return nullptr;
|
||||
}
|
||||
return it->second();
|
||||
return it->second(name, execution_plan);
|
||||
}
|
||||
} // namespace mindspore
|
||||
|
|
|
@ -15,7 +15,8 @@
|
|||
*/
|
||||
#include "extendrt/graph_executor/mindrt_graph_executor.h"
|
||||
|
||||
#include "src/common/log.h"
|
||||
#include <algorithm>
|
||||
|
||||
#include "extendrt/graph_executor/factory.h"
|
||||
#include "litert/mindrt_executor.h"
|
||||
#include "extendrt/execution_plan.h"
|
||||
|
@ -34,8 +35,8 @@ MindRTGraphExecutor::MindRTGraphExecutor(const std::string &name,
|
|||
if (infer_execution_plan == nullptr) {
|
||||
MS_LOG(ERROR) << "MindRTGraphExecutor::MindRTGraphExecutor Not Supported execution plan is passed";
|
||||
} else {
|
||||
mindrt_executor_ = std::make_shared<mindspore::lite::MindrtExecutor>(infer_execution_plan->GetInputMap(),
|
||||
infer_execution_plan->GetOutputMap());
|
||||
mindrt_executor_ = std::make_shared<mindspore::lite::MindrtExecutor>(infer_execution_plan->GetInputsMap(),
|
||||
infer_execution_plan->GetOutputsMap());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -48,8 +49,13 @@ Status MindRTGraphExecutor::Prepare() {
|
|||
MS_LOG(ERROR) << "FlowExecutor::Prepare execution plan is nullptr";
|
||||
return kLiteError;
|
||||
}
|
||||
return mindrt_executor_->Prepare(execution_plan_->ToKernelList(), execution_plan_->GetInputs(),
|
||||
execution_plan_->GetOutputs(), execution_plan_->GetContext().get());
|
||||
auto ret = mindrt_executor_->Prepare(execution_plan_->ToKernelList(), execution_plan_->GetInputs(),
|
||||
execution_plan_->GetOutputs(), execution_plan_->GetContext().get());
|
||||
if (ret != 0) {
|
||||
MS_LOG(ERROR) << "FlowExecutor::Prepare prepare execution plan failed with code " << ret;
|
||||
return kLiteError;
|
||||
}
|
||||
return kSuccess;
|
||||
}
|
||||
|
||||
Status MindRTGraphExecutor::Execute() {
|
||||
|
@ -61,18 +67,30 @@ Status MindRTGraphExecutor::Execute() {
|
|||
MS_LOG(ERROR) << "FlowExecutor::Execute execution plan is nullptr";
|
||||
return kLiteError;
|
||||
}
|
||||
return mindrt_executor_->Run(execution_plan_->GetInputs(), execution_plan_->GetOutputs(),
|
||||
execution_plan_->ToKernelList(), execution_plan_->GetKernelBeforeCallBack(),
|
||||
execution_plan_->GetKernelAfterCallBack());
|
||||
auto ret =
|
||||
mindrt_executor_->Run(execution_plan_->GetInputs(), execution_plan_->GetOutputs(), execution_plan_->ToKernelList(),
|
||||
execution_plan_->GetKernelBeforeCallBack(), execution_plan_->GetKernelAfterCallBack());
|
||||
if (ret != 0) {
|
||||
MS_LOG(ERROR) << "FlowExecutor::Execute run execution plan failed with code " << ret;
|
||||
return kLiteError;
|
||||
}
|
||||
return kSuccess;
|
||||
}
|
||||
|
||||
int MindRTGraphExecutor::Resize(const std::vector<infer::abstract::Tensor *> &inputs,
|
||||
const std::vector<std::vector<int>> &dims) {
|
||||
const std::vector<std::vector<int64_t>> &dims) {
|
||||
if (mindrt_executor_ == nullptr) {
|
||||
MS_LOG(ERROR) << "FlowExecutor::Resize executor is nullptr";
|
||||
return kLiteError;
|
||||
}
|
||||
return mindrt_executor_->Resize(inputs, dims);
|
||||
std::vector<std::vector<int>> dims32;
|
||||
std::transform(dims.begin(), dims.end(), std::back_inserter(dims32), [](std::vector<int64_t> shape) {
|
||||
std::vector<int> shape32;
|
||||
std::transform(shape.begin(), shape.end(), std::back_inserter(shape32),
|
||||
[](int64_t dim) { return static_cast<int>(dim); });
|
||||
return shape32;
|
||||
});
|
||||
return mindrt_executor_->Resize(inputs, dims32);
|
||||
}
|
||||
|
||||
static std::shared_ptr<infer::abstract::Executor> MindRTGraphExecutorCreator(
|
||||
|
|
|
@ -37,7 +37,8 @@ class MindRTGraphExecutor : public mindspore::infer::abstract::Executor {
|
|||
|
||||
Status Execute() override;
|
||||
|
||||
int Resize(const std::vector<infer::abstract::Tensor *> &inputs, const std::vector<std::vector<int>> &dims) override;
|
||||
int Resize(const std::vector<infer::abstract::Tensor *> &inputs,
|
||||
const std::vector<std::vector<int64_t>> &dims) override;
|
||||
|
||||
private:
|
||||
std::string name_;
|
||||
|
|
|
@ -15,9 +15,8 @@
|
|||
*/
|
||||
#include "extendrt/graph_runtime/default_graph_runtime.h"
|
||||
|
||||
#include "extendrt/graph_executor/plan_executor.h"
|
||||
#include "src/common/log.h"
|
||||
#include "extendrt/graph_runtime/factory.h"
|
||||
#include "extendrt/graph_executor/factory.h"
|
||||
|
||||
namespace mindspore {
|
||||
using ExecutionPlan = mindspore::infer::abstract::ExecutionPlan;
|
||||
|
@ -38,7 +37,7 @@ Status DefaultGraphRuntime::Prepare(std::shared_ptr<ExecutionPlan> execution_pla
|
|||
}
|
||||
|
||||
MS_LOG(DEBUG) << "DefaultGraphRuntime::Prepare Prepare Execution Plan Begin of Executor " << executor->Name();
|
||||
auto status = executor->Prepare(nullptr);
|
||||
auto status = executor->Prepare();
|
||||
if (status != kSuccess) {
|
||||
MS_LOG(ERROR) << "DefaultGraphRuntime::Prepare Prepare Execution Plan Failed in Executor " << executor->Name();
|
||||
return kLiteError;
|
||||
|
@ -107,7 +106,7 @@ Status DefaultGraphRuntime::Execute(const std::vector<infer::abstract::Tensor *>
|
|||
return kSuccess;
|
||||
}
|
||||
|
||||
Status DefaultGraphRuntime::Resize(const std::vector<infer::abstract::Tensor *> *inputs,
|
||||
Status DefaultGraphRuntime::Resize(const std::vector<infer::abstract::Tensor *> &inputs,
|
||||
const std::vector<std::vector<int64_t>> &dims) {
|
||||
MS_LOG(INFO) << "DefaultGraphRuntime::Resize Begin";
|
||||
|
||||
|
@ -134,14 +133,31 @@ Status DefaultGraphRuntime::Resize(const std::vector<infer::abstract::Tensor *>
|
|||
return kSuccess;
|
||||
}
|
||||
|
||||
std::vector<infer::abstract::Tensor *> DefaultGraphRuntime::GetInputs() {
|
||||
if (execution_plan_ == nullptr) {
|
||||
MS_LOG(ERROR) << "DefaultGraphRuntime::Execute Execution Plan is nullptr.";
|
||||
return std::vector<infer::abstract::Tensor *>{};
|
||||
}
|
||||
return execution_plan_->GetInputs();
|
||||
}
|
||||
|
||||
std::vector<infer::abstract::Tensor *> DefaultGraphRuntime::GetOutputs() {
|
||||
if (execution_plan_ == nullptr) {
|
||||
MS_LOG(ERROR) << "DefaultGraphRuntime::Execute Execution Plan is nullptr.";
|
||||
return std::vector<infer::abstract::Tensor *>{};
|
||||
}
|
||||
return execution_plan_->GetOutputs();
|
||||
}
|
||||
|
||||
std::shared_ptr<infer::abstract::Executor> DefaultGraphRuntime::SelectExecutor() {
|
||||
if (default_executor_ == nullptr) {
|
||||
default_executor_ = std::make_shared<infer::PlanExecutor>("plan-executor");
|
||||
default_executor_ =
|
||||
GraphExecutorRegistry::GetInstance().GetExecutor(kMindRTExecutor, "mindrt-executor", execution_plan_);
|
||||
}
|
||||
return default_executor_;
|
||||
}
|
||||
|
||||
static std::shared_ptr<InferSession> DefaultGraphRuntimeCreator() {
|
||||
static std::shared_ptr<infer::abstract::GraphRuntime> DefaultGraphRuntimeCreator() {
|
||||
auto graph_runtime = std::make_shared<DefaultGraphRuntime>();
|
||||
return graph_runtime;
|
||||
}
|
||||
|
|
|
@ -36,9 +36,13 @@ class DefaultGraphRuntime : public mindspore::infer::abstract::GraphRuntime {
|
|||
infer::abstract::KernelCallBack before = nullptr,
|
||||
infer::abstract::KernelCallBack after = nullptr) override;
|
||||
|
||||
Status Resize(const std::vector<infer::abstract::Tensor *> *inputs,
|
||||
Status Resize(const std::vector<infer::abstract::Tensor *> &inputs,
|
||||
const std::vector<std::vector<int64_t>> &dims) override;
|
||||
|
||||
std::vector<infer::abstract::Tensor *> GetInputs() override;
|
||||
|
||||
std::vector<infer::abstract::Tensor *> GetOutputs() override;
|
||||
|
||||
private:
|
||||
std::shared_ptr<infer::abstract::Executor> SelectExecutor();
|
||||
|
||||
|
|
|
@ -17,6 +17,6 @@
|
|||
#define MINDSPORE_LITE_EXTENDRT_GRAPH_RUNTIME_TYPE_H_
|
||||
|
||||
namespace mindspore {
|
||||
enum GraphRuntimeType { kDefaultRuntime = 0, kSingleOpSession, kLiteInferSession, kDelegateSession, kNoneRuntime };
|
||||
enum GraphRuntimeType { kDefaultRuntime = 0, kNoneRuntime };
|
||||
} // namespace mindspore
|
||||
#endif // MINDSPORE_LITE_EXTENDRT_GRAPH_RUNTIME_TYPE_H_
|
||||
|
|
|
@ -30,7 +30,7 @@ namespace mindspore {
|
|||
/// \brief Default Infer Session Implementation, using kernelmod, not implemented now.
|
||||
class DefaultInferSession : public InferSession {
|
||||
public:
|
||||
explicit DefaultInferSession(const std::shared_ptr<Context> &context) { context_ = context; }
|
||||
explicit DefaultInferSession(const std::shared_ptr<Context> &context) : context_(context) {}
|
||||
virtual ~DefaultInferSession() = default;
|
||||
Status Init(const std::shared_ptr<Context> &context) override;
|
||||
Status CompileGraph(FuncGraphPtr graph, const void *data = nullptr, size_t size = 0) override;
|
||||
|
|
|
@ -48,10 +48,10 @@ class Executor : public std::enable_shared_from_this<Executor> {
|
|||
/// \brief Resize Executor Kernels.
|
||||
///
|
||||
/// \param[in] inputs, inputs need resize
|
||||
/// \param[in] dim, target shapes for resize inputs
|
||||
/// \param[in] dims, target shapes for resize inputs
|
||||
///
|
||||
/// \return Status.
|
||||
virtual int Resize(const std::vector<Tensor *> &inputs, const std::vector<std::vector<int>> &dims) = 0;
|
||||
virtual int Resize(const std::vector<Tensor *> &inputs, const std::vector<std::vector<int64_t>> &dims) = 0;
|
||||
};
|
||||
} // namespace mindspore::infer::abstract
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ class GraphRuntime : public std::enable_shared_from_this<GraphRuntime> {
|
|||
/// \param[in] dims, targe dim shape to resize
|
||||
///
|
||||
/// \return Status.
|
||||
virtual Status Resize(const std::vector<Tensor *> *inputs, const std::vector<std::vector<int64_t>> &dims) = 0;
|
||||
virtual Status Resize(const std::vector<Tensor *> &inputs, const std::vector<std::vector<int64_t>> &dims) = 0;
|
||||
|
||||
/// \brief Get list of inputs for the model.
|
||||
///
|
||||
|
|
Loading…
Reference in New Issue