add_subdirectory(ge_api_c_wrapper)
add_subdirectory(ge/passes)
add_subdirectory(ge/runtime)
add_subdirectory(ge/custom_op)
add_subdirectory(ge/onnx_plugin)
file(GLOB_RECURSE GE_API_C_WRAPPER CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/*.py")
execute_process(
COMMAND ${HI_PYTHON} -c "import sys; print(f'cp{sys.version_info.major}{sys.version_info.minor}')"
OUTPUT_VARIABLE GE_PYTHON_ARTIFACT_PYTHON_TAG
OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND ${HI_PYTHON} -c "import sys; print(sys.version.split()[0])"
OUTPUT_VARIABLE GE_PYTHON_ARTIFACT_PYTHON_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
)
string(TOLOWER "${CMAKE_SYSTEM_NAME}" GE_PYTHON_ARTIFACT_SYSTEM_NAME)
set(GE_PYTHON_ARTIFACT_PLATFORM_TAG "${GE_PYTHON_ARTIFACT_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
string(REPLACE "-" "_" GE_PYTHON_PASS_WHEEL_PLATFORM "${GE_PYTHON_ARTIFACT_PLATFORM_TAG}")
set(GE_PYTHON_ARTIFACT_SET_NAME "${GE_PYTHON_ARTIFACT_PYTHON_TAG}-${GE_PYTHON_ARTIFACT_PLATFORM_TAG}")
set(GE_PYTHON_MAIN_WHEEL ${CMAKE_CURRENT_BINARY_DIR}/ge_py-0.0.1-py3-none-any.whl)
set(GE_PYTHON_MAIN_WHEEL_DIR ${CMAKE_CURRENT_BINARY_DIR}/wheel)
set(GE_PYTHON_PASS_ARTIFACT_DIR
${CMAKE_CURRENT_BINARY_DIR}/native_artifacts/${GE_PYTHON_ARTIFACT_SET_NAME})
set(GE_PYTHON_PASS_BRIDGE_ABI_VERSION 1)
set(GE_PYTHON_RUNTIME_NATIVE_ABI_VERSION 1)
set(GE_PYTHON_CUSTOM_OP_BRIDGE_ABI_VERSION 1)
set(GE_PYTHON_ONNX_PLUGIN_BRIDGE_ABI_VERSION 1)
set(GE_PYTHON_PASS_ARTIFACT_MANIFEST ${CMAKE_CURRENT_BINARY_DIR}/python_pass_artifact_manifest.json)
set(GE_PYTHON_RUNTIME_ARTIFACT_MANIFEST ${CMAKE_CURRENT_BINARY_DIR}/python_runtime_artifact_manifest.json)
set(GE_PYTHON_CUSTOM_OP_ARTIFACT_MANIFEST ${CMAKE_CURRENT_BINARY_DIR}/python_custom_op_artifact_manifest.json)
set(GE_PYTHON_ONNX_PLUGIN_ARTIFACT_MANIFEST ${CMAKE_CURRENT_BINARY_DIR}/python_onnx_plugin_artifact_manifest.json)
set(GE_PYTHON_PASS_NATIVE_WHEEL
${CMAKE_CURRENT_BINARY_DIR}/ge_py_pass_bridge-0.0.1-${GE_PYTHON_ARTIFACT_PYTHON_TAG}-${GE_PYTHON_ARTIFACT_PYTHON_TAG}-${GE_PYTHON_PASS_WHEEL_PLATFORM}.whl)
set(GE_PYTHON_PASS_NATIVE_WHEEL ${GE_PYTHON_PASS_NATIVE_WHEEL} CACHE INTERNAL "GE python pass native artifact wheel")
set(GE_PYTHON_PASS_NATIVE_MATRIX_DIST_DIR ${CMAKE_CURRENT_BINARY_DIR}/native_wheel_matrix_dist)
set(GE_PYTHON_PASS_BUILD_METADATA_DIR ${PROJECT_BINARY_DIR})
set(GE_PYTHON_PASS_MATRIX_COMPILER_ARGS "--cxx-compiler" "${CMAKE_CXX_COMPILER}")
if (CMAKE_CXX_COMPILER_LAUNCHER)
list(APPEND GE_PYTHON_PASS_MATRIX_COMPILER_ARGS
"--cxx-compiler-launcher" "${CMAKE_CXX_COMPILER_LAUNCHER}")
endif()
file(WRITE ${GE_PYTHON_PASS_ARTIFACT_MANIFEST}
"{\n"
" \"python_tag\": \"${GE_PYTHON_ARTIFACT_PYTHON_TAG}\",\n"
" \"python_version\": \"${GE_PYTHON_ARTIFACT_PYTHON_VERSION}\",\n"
" \"platform\": \"${GE_PYTHON_ARTIFACT_PLATFORM_TAG}\",\n"
" \"bridge_abi\": ${GE_PYTHON_PASS_BRIDGE_ABI_VERSION},\n"
" \"build_python\": {\n"
" \"executable\": \"${HI_PYTHON}\",\n"
" \"version\": \"${GE_PYTHON_ARTIFACT_PYTHON_VERSION}\",\n"
" \"include\": \"${HI_PYTHON_INC}\",\n"
" \"libpython\": \"${HI_PYTHON_EMBED_LIBRARIES}\",\n"
" \"pybind11_include\": \"${pybind11_INCLUDE_DIR}\",\n"
" \"link_python\": true\n"
" },\n"
" \"artifacts\": {\n"
" \"bridge\": \"libge_python_pass_bridge.so\",\n"
" \"native\": \"_ge_pass_native.so\"\n"
" }\n"
"}\n"
)
file(WRITE ${GE_PYTHON_RUNTIME_ARTIFACT_MANIFEST}
"{\n"
" \"python_tag\": \"${GE_PYTHON_ARTIFACT_PYTHON_TAG}\",\n"
" \"python_version\": \"${GE_PYTHON_ARTIFACT_PYTHON_VERSION}\",\n"
" \"platform\": \"${GE_PYTHON_ARTIFACT_PLATFORM_TAG}\",\n"
" \"native_abi\": ${GE_PYTHON_RUNTIME_NATIVE_ABI_VERSION},\n"
" \"build_python\": {\n"
" \"executable\": \"${HI_PYTHON}\",\n"
" \"version\": \"${GE_PYTHON_ARTIFACT_PYTHON_VERSION}\",\n"
" \"include\": \"${HI_PYTHON_INC}\",\n"
" \"libpython\": \"${HI_PYTHON_EMBED_LIBRARIES}\",\n"
" \"pybind11_include\": \"${pybind11_INCLUDE_DIR}\",\n"
" \"link_python\": true\n"
" },\n"
" \"artifacts\": {\n"
" \"native\": \"_ge_runtime_native.so\"\n"
" }\n"
"}\n"
)
file(WRITE ${GE_PYTHON_CUSTOM_OP_ARTIFACT_MANIFEST}
"{\n"
" \"python_tag\": \"${GE_PYTHON_ARTIFACT_PYTHON_TAG}\",\n"
" \"python_version\": \"${GE_PYTHON_ARTIFACT_PYTHON_VERSION}\",\n"
" \"platform\": \"${GE_PYTHON_ARTIFACT_PLATFORM_TAG}\",\n"
" \"bridge_abi\": ${GE_PYTHON_CUSTOM_OP_BRIDGE_ABI_VERSION},\n"
" \"build_python\": {\n"
" \"executable\": \"${HI_PYTHON}\",\n"
" \"version\": \"${GE_PYTHON_ARTIFACT_PYTHON_VERSION}\",\n"
" \"include\": \"${HI_PYTHON_INC}\",\n"
" \"libpython\": \"${HI_PYTHON_EMBED_LIBRARIES}\",\n"
" \"pybind11_include\": \"${pybind11_INCLUDE_DIR}\",\n"
" \"link_python\": true\n"
" },\n"
" \"artifacts\": {\n"
" \"bridge\": \"libge_python_custom_op_bridge.so\",\n"
" \"native\": \"_ge_custom_op_native.so\"\n"
" }\n"
"}\n"
)
file(WRITE ${GE_PYTHON_ONNX_PLUGIN_ARTIFACT_MANIFEST}
"{\n"
" \"python_tag\": \"${GE_PYTHON_ARTIFACT_PYTHON_TAG}\",\n"
" \"python_version\": \"${GE_PYTHON_ARTIFACT_PYTHON_VERSION}\",\n"
" \"platform\": \"${GE_PYTHON_ARTIFACT_PLATFORM_TAG}\",\n"
" \"bridge_abi\": ${GE_PYTHON_ONNX_PLUGIN_BRIDGE_ABI_VERSION},\n"
" \"artifacts\": {\n"
" \"bridge\": \"libge_python_onnx_plugin_bridge.so\",\n"
" \"native\": \"_ge_onnx_plugin_native.so\"\n"
" }\n"
"}\n"
)
set(GE_PYTHON_PASS_FALLBACK_CODEGEN_DIR ${CMAKE_CURRENT_BINARY_DIR}/python_pass_fallback_codegen)
set(GE_PYTHON_PASS_FALLBACK_CODEGEN_CONFIG
${GE_PYTHON_PASS_FALLBACK_CODEGEN_DIR}/build_config.json)
set(GE_PYTHON_PASS_FALLBACK_CODEGEN_SOURCES_PY
${GE_PYTHON_PASS_FALLBACK_CODEGEN_DIR}/_sources.py)
set(GE_PYTHON_PASS_FALLBACK_CODEGEN_INIT_PY
${GE_PYTHON_PASS_FALLBACK_CODEGEN_DIR}/__init__.py)
set(GE_PYTHON_PASS_BRIDGE_SOURCES
${AIR_CODE_DIR}/compiler/graph/fusion/pass/python_pass_pybind_bridge.cc)
set(GE_PYTHON_PASS_BRIDGE_HEADERS
${AIR_CODE_DIR}/compiler/graph/fusion/pass/python_pass_pybind_bridge.h
${AIR_CODE_DIR}/compiler/graph/fusion/pass/python_pass_adapter.h
${AIR_CODE_DIR}/compiler/graph/fusion/pass/pass_registry.h
${AIR_CODE_DIR}/compiler/graph/fusion/pass/python_pass_bridge_c_api.h)
add_custom_target(ge_python ALL)
add_custom_target(ge_python_main_wheel DEPENDS ${GE_PYTHON_MAIN_WHEEL})
add_custom_target(ge_python_native_wheel DEPENDS ${GE_PYTHON_PASS_NATIVE_WHEEL})
add_custom_target(ge_python_pass_native_wheel_matrix
COMMAND ${HI_PYTHON} ${CMAKE_CURRENT_SOURCE_DIR}/python_pass_native_build/build_python_pass_native_matrix.py
--source-dir ${AIR_CODE_DIR}
--build-dir ${GE_PYTHON_PASS_BUILD_METADATA_DIR}
--work-dir ${CMAKE_CURRENT_BINARY_DIR}/native_wheel_matrix_build
--dist-dir ${GE_PYTHON_PASS_NATIVE_MATRIX_DIST_DIR}
--platform-tag ${GE_PYTHON_ARTIFACT_PLATFORM_TAG}
--wheel-platform ${GE_PYTHON_PASS_WHEEL_PLATFORM}
--bridge-abi ${GE_PYTHON_PASS_BRIDGE_ABI_VERSION}
--current-tag ${GE_PYTHON_ARTIFACT_PYTHON_TAG}
--current-wheel ${GE_PYTHON_PASS_NATIVE_WHEEL}
${GE_PYTHON_PASS_MATRIX_COMPILER_ARGS}
COMMENT "Build GE python pass native wheels for all supported Python versions found in PATH"
)
add_custom_target(ge_python_pass_fallback_codegen
DEPENDS ${GE_PYTHON_PASS_FALLBACK_CODEGEN_CONFIG}
${GE_PYTHON_PASS_FALLBACK_CODEGEN_SOURCES_PY}
${GE_PYTHON_PASS_FALLBACK_CODEGEN_INIT_PY})
add_dependencies(ge_python_main_wheel ge_python_pass_fallback_codegen)
add_dependencies(ge_python_pass_native_wheel_matrix ge_python_native_wheel)
add_dependencies(ge_python ge_python_main_wheel ge_python_pass_native_wheel_matrix)
add_custom_command(
OUTPUT ${GE_PYTHON_PASS_FALLBACK_CODEGEN_CONFIG}
${GE_PYTHON_PASS_FALLBACK_CODEGEN_SOURCES_PY}
${GE_PYTHON_PASS_FALLBACK_CODEGEN_INIT_PY}
COMMAND ${HI_PYTHON} ${CMAKE_CURRENT_SOURCE_DIR}/python_pass_native_build/gen_fallback_resources.py
--output-dir ${GE_PYTHON_PASS_FALLBACK_CODEGEN_DIR}
--build-dir ${GE_PYTHON_PASS_BUILD_METADATA_DIR}
--cann-root ${ASCEND_INSTALL_PATH}
--bridge-abi ${GE_PYTHON_PASS_BRIDGE_ABI_VERSION}
--bridge-source ${GE_PYTHON_PASS_BRIDGE_SOURCES}
--bridge-header ${GE_PYTHON_PASS_BRIDGE_HEADERS}
--native-source ${GE_PYTHON_PASS_NATIVE_SOURCES}
--native-header ${GE_PYTHON_PASS_NATIVE_HEADERS}
DEPENDS ${GE_PYTHON_PASS_BRIDGE_SOURCES}
${GE_PYTHON_PASS_BRIDGE_HEADERS}
${GE_PYTHON_PASS_NATIVE_SOURCES}
${GE_PYTHON_PASS_NATIVE_HEADERS}
${CMAKE_CURRENT_SOURCE_DIR}/python_pass_native_build/gen_fallback_resources.py
COMMAND_EXPAND_LISTS
COMMENT "Generate GE python pass fallback codegen resources"
)
add_custom_command(
OUTPUT ${GE_PYTHON_MAIN_WHEEL}
COMMAND echo "Start to build ge-py wheel package"
&& rm -rf ${GE_PYTHON_MAIN_WHEEL_DIR}
&& mkdir -p ${GE_PYTHON_MAIN_WHEEL_DIR}
&& cp -r ${CMAKE_CURRENT_SOURCE_DIR}/setup.py ${GE_PYTHON_MAIN_WHEEL_DIR}/setup.py
&& cp -r ${CMAKE_CURRENT_SOURCE_DIR}/MANIFEST.in ${GE_PYTHON_MAIN_WHEEL_DIR}/
&& cp -r ${CMAKE_CURRENT_SOURCE_DIR}/ge ${GE_PYTHON_MAIN_WHEEL_DIR}/
&& ${CMAKE_COMMAND} -E remove ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/passes/CMakeLists.txt
&& ${CMAKE_COMMAND} -E remove_directory ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/passes/native_bindings
&& ${CMAKE_COMMAND} -E remove_directory ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/passes/python_pass_artifacts
&& ${CMAKE_COMMAND} -E remove_directory ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/passes/fallback_codegen
&& ${CMAKE_COMMAND} -E remove ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/runtime/CMakeLists.txt
&& ${CMAKE_COMMAND} -E remove_directory ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/runtime/native_bindings
&& ${CMAKE_COMMAND} -E remove_directory ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/runtime/python_runtime_artifacts
&& ${CMAKE_COMMAND} -E remove ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/custom_op/CMakeLists.txt
&& ${CMAKE_COMMAND} -E remove_directory ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/custom_op/native_bindings
&& ${CMAKE_COMMAND} -E remove ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/onnx_plugin/CMakeLists.txt
&& ${CMAKE_COMMAND} -E remove_directory ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/onnx_plugin/native_bindings
&& ${CMAKE_COMMAND} -E remove ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/onnx_plugin/_ge_onnx_plugin_native.so
&& mkdir -p ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/runtime/python_runtime_artifacts/${GE_PYTHON_ARTIFACT_SET_NAME}
&& cp ${GE_PYTHON_RUNTIME_ARTIFACT_MANIFEST} ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/runtime/python_runtime_artifacts/${GE_PYTHON_ARTIFACT_SET_NAME}/manifest.json
&& cp $<TARGET_FILE:_ge_runtime_native> ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/runtime/python_runtime_artifacts/${GE_PYTHON_ARTIFACT_SET_NAME}/_ge_runtime_native.so
&& mkdir -p ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/custom_op/python_custom_op_artifacts/${GE_PYTHON_ARTIFACT_SET_NAME}
&& cp ${GE_PYTHON_CUSTOM_OP_ARTIFACT_MANIFEST} ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/custom_op/python_custom_op_artifacts/${GE_PYTHON_ARTIFACT_SET_NAME}/manifest.json
&& cp $<TARGET_FILE:ge_python_custom_op_bridge> ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/custom_op/python_custom_op_artifacts/${GE_PYTHON_ARTIFACT_SET_NAME}/libge_python_custom_op_bridge.so
&& cp $<TARGET_FILE:_ge_custom_op_native> ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/custom_op/python_custom_op_artifacts/${GE_PYTHON_ARTIFACT_SET_NAME}/_ge_custom_op_native.so
&& mkdir -p ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/onnx_plugin/python_onnx_plugin_artifacts/${GE_PYTHON_ARTIFACT_SET_NAME}
&& cp ${GE_PYTHON_ONNX_PLUGIN_ARTIFACT_MANIFEST} ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/onnx_plugin/python_onnx_plugin_artifacts/${GE_PYTHON_ARTIFACT_SET_NAME}/manifest.json
&& cp $<TARGET_FILE:ge_python_onnx_plugin_bridge> ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/onnx_plugin/python_onnx_plugin_artifacts/${GE_PYTHON_ARTIFACT_SET_NAME}/libge_python_onnx_plugin_bridge.so
&& cp $<TARGET_FILE:_ge_onnx_plugin_native> ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/onnx_plugin/python_onnx_plugin_artifacts/${GE_PYTHON_ARTIFACT_SET_NAME}/_ge_onnx_plugin_native.so
&& ${CMAKE_COMMAND} -E copy_directory ${GE_PYTHON_PASS_FALLBACK_CODEGEN_DIR} ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/passes/fallback_codegen
&& find ${GE_PYTHON_MAIN_WHEEL_DIR}/ge -name __pycache__ -type d -exec rm -rf {} +
&& cp $<TARGET_FILE:graph_wrapper> ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/_capi/
&& cp $<TARGET_FILE:ge_runtime_wrapper> ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/_capi/
&& cp $<TARGET_FILE:offline_compile_wrapper> ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/_capi/
&& cp $<TARGET_FILE:pyatc_wrapper> ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/_capi/
&& cp $<TARGET_FILE:ge_utils_wrapper> ${GE_PYTHON_MAIN_WHEEL_DIR}/ge/_capi/
&& cd ${GE_PYTHON_MAIN_WHEEL_DIR}
&& ${HI_PYTHON} setup.py bdist_wheel >/dev/null
&& cp -f dist/ge_py-0.0.1-py3-none-any.whl ${GE_PYTHON_MAIN_WHEEL}
&& echo "Build ge-py wheel package end"
DEPENDS eager_style_graph_builder_base ge_api_c_wrapper graph_wrapper
_ge_runtime_native _ge_custom_op_native _ge_onnx_plugin_native ge_python_custom_op_bridge
ge_python_onnx_plugin_bridge
${GE_API_C_WRAPPER}
${GE_PYTHON_RUNTIME_ARTIFACT_MANIFEST}
${GE_PYTHON_CUSTOM_OP_ARTIFACT_MANIFEST}
${GE_PYTHON_ONNX_PLUGIN_ARTIFACT_MANIFEST}
${GE_PYTHON_PASS_FALLBACK_CODEGEN_CONFIG}
)
add_custom_command(
OUTPUT ${GE_PYTHON_PASS_NATIVE_WHEEL}
COMMAND echo "Start to build ge-py-pass-bridge native wheel package"
&& echo "Build ${GE_PYTHON_ARTIFACT_PYTHON_TAG} native artifacts with python[${HI_PYTHON}], version[${GE_PYTHON_ARTIFACT_PYTHON_VERSION}], include[${HI_PYTHON_INC}], libpython[${HI_PYTHON_EMBED_LIBRARIES}], pybind11[${pybind11_INCLUDE_DIR}], link_python[yes], rpath_python[no]"
&& rm -rf ${GE_PYTHON_PASS_ARTIFACT_DIR}
&& mkdir -p ${GE_PYTHON_PASS_ARTIFACT_DIR}
&& cp ${GE_PYTHON_PASS_ARTIFACT_MANIFEST} ${GE_PYTHON_PASS_ARTIFACT_DIR}/manifest.json
&& cp $<TARGET_FILE:ge_python_pass_bridge> ${GE_PYTHON_PASS_ARTIFACT_DIR}/libge_python_pass_bridge.so
&& cp $<TARGET_FILE:_ge_pass_native> ${GE_PYTHON_PASS_ARTIFACT_DIR}/_ge_pass_native.so
&& ${HI_PYTHON} ${CMAKE_CURRENT_SOURCE_DIR}/python_pass_native_build/build_python_pass_native_wheel.py
--artifact-dir ${GE_PYTHON_PASS_ARTIFACT_DIR}
--python-tag ${GE_PYTHON_ARTIFACT_PYTHON_TAG}
--platform-tag ${GE_PYTHON_ARTIFACT_PLATFORM_TAG}
--wheel-platform ${GE_PYTHON_PASS_WHEEL_PLATFORM}
--output-dir ${CMAKE_CURRENT_BINARY_DIR}
&& echo "Build ge-py-pass-bridge native wheel package end"
DEPENDS _ge_pass_native ge_python_pass_bridge ${GE_PYTHON_PASS_ARTIFACT_MANIFEST}
${CMAKE_CURRENT_SOURCE_DIR}/python_pass_native_build/build_python_pass_native_wheel.py
)
install(FILES ${GE_PYTHON_MAIN_WHEEL} ${INSTALL_OPTIONAL}
DESTINATION ${INSTALL_LIBRARY_DIR}
)
install(DIRECTORY ${GE_PYTHON_PASS_NATIVE_MATRIX_DIST_DIR}/ ${INSTALL_OPTIONAL}
DESTINATION ${INSTALL_LIBRARY_DIR}
FILES_MATCHING PATTERN "ge_py_pass_bridge-*.whl"
PATTERN "_build_ge_py_pass_bridge_*" EXCLUDE
)