Ability to build OpenVINO wheel based on OV developer package (#13197)

* Allow to compile wheel package based on OpenVINO developer package

* Added wheel specific runtime dir to avoid issues with generator expressions

* Added backward compatibility

* Trying to fix RHEL, U20

* Fixed cmake options in setup.py
This commit is contained in:
Ilya Lavrenov
2022-09-26 11:33:50 +04:00
committed by GitHub
parent 7bbd428e48
commit 07d68b5895
10 changed files with 62 additions and 34 deletions

View File

@@ -12,11 +12,9 @@ project(OpenVINOPython DESCRIPTION "OpenVINO Runtime Python bindings")
if(NOT DEFINED OpenVINO_SOURCE_DIR)
find_package(InferenceEngineDeveloperPackage REQUIRED)
set(OpenVINO_BINARY_DIR "${InferenceEngineDeveloperPackage_DIR}")
endif()
set(PYTHON_SOURCE_DIR ${OpenVINOPython_SOURCE_DIR}/src)
#
# Check python requirements
#
@@ -128,15 +126,9 @@ endif()
set(wheel_reqs "${OpenVINOPython_SOURCE_DIR}/wheel/requirements-dev.txt")
ov_check_pip_packages(REQUIREMENTS_FILE "${OpenVINOPython_SOURCE_DIR}/wheel/requirements-dev.txt"
RESULT_VAR wheel_req_FOUND
RESULT_VAR ENABLE_WHEEL_DEFAULT
MESSAGE_MODE WARNING)
if(wheel_req_FOUND AND "${CMAKE_SOURCE_DIR}" STREQUAL "${OpenVINO_SOURCE_DIR}")
set(ENABLE_WHEEL_DEFAULT ON)
else()
set(ENABLE_WHEEL_DEFAULT OFF)
endif()
if(LINUX)
find_host_program(patchelf_program
NAMES patchelf
@@ -154,6 +146,7 @@ ie_dependent_option(ENABLE_WHEEL "Build wheel packages for PyPI" ${ENABLE_WHEEL_
#
# Build the code
#
add_subdirectory(thirdparty/pybind11 EXCLUDE_FROM_ALL)
add_subdirectory(src/compatibility/pyngraph)
add_subdirectory(src/pyopenvino)

View File

@@ -96,7 +96,7 @@ if(OpenVINO_SOURCE_DIR OR InferenceEngineDeveloperPackage_FOUND)
ie_cpack_add_component(${OV_CPACK_COMP_PYTHON_OPENVINO}_${pyversion}
HIDDEN)
install(DIRECTORY ${PYTHON_SOURCE_DIR}/openvino
install(DIRECTORY ${OpenVINOPython_SOURCE_DIR}/src/openvino
DESTINATION ${OV_CPACK_PYTHONDIR}/${pyversion}
COMPONENT ${OV_CPACK_COMP_PYTHON_OPENVINO}_${pyversion}
USE_SOURCE_PERMISSIONS

View File

@@ -25,7 +25,7 @@ function(frontend_module TARGET FRAMEWORK INSTALL_COMPONENT)
add_dependencies(py_ov_frontends ${TARGET_NAME})
target_include_directories(${TARGET_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}"
"${PYTHON_SOURCE_DIR}/pyopenvino/utils/")
"${OpenVINOPython_SOURCE_DIR}/src/pyopenvino/utils/")
target_link_libraries(${TARGET_NAME} PRIVATE openvino::runtime openvino::frontend::${FRAMEWORK})
set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION_RELEASE ${ENABLE_LTO})
@@ -37,7 +37,7 @@ function(frontend_module TARGET FRAMEWORK INSTALL_COMPONENT)
# perform copy
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${PYTHON_SOURCE_DIR}/openvino/frontend/${FRAMEWORK}/__init__.py
COMMAND ${CMAKE_COMMAND} -E copy ${OpenVINOPython_SOURCE_DIR}/src/openvino/frontend/${FRAMEWORK}/__init__.py
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/__init__.py)
install(TARGETS ${TARGET_NAME}

View File

@@ -40,7 +40,7 @@ endif()
# perform copy
add_custom_command(TARGET ${TARGET_NAME}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${PYTHON_SOURCE_DIR}/openvino/test_utils/__init__.py ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/__init__.py
COMMAND ${CMAKE_COMMAND} -E copy ${OpenVINOPython_SOURCE_DIR}/src/openvino/test_utils/__init__.py ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/__init__.py
)
add_clang_format_target(${TARGET_NAME}_clang FOR_TARGETS ${TARGET_NAME}
@@ -54,7 +54,7 @@ install(TARGETS ${TARGET_NAME}
LIBRARY DESTINATION ${PYTHON_BRIDGE_CPACK_PATH}/${pyversion}/openvino/test_utils
COMPONENT tests EXCLUDE_FROM_ALL)
install(PROGRAMS ${PYTHON_SOURCE_DIR}/openvino/test_utils/__init__.py
install(PROGRAMS ${OpenVINOPython_SOURCE_DIR}/src/openvino/test_utils/__init__.py
DESTINATION ${PYTHON_BRIDGE_CPACK_PATH}/${pyversion}/openvino/test_utils
COMPONENT tests
EXCLUDE_FROM_ALL)

View File

@@ -45,19 +45,20 @@ set(openvino_wheel_path "${openvino_wheels_output_dir}/${openvino_wheel_name}")
add_custom_command(OUTPUT ${openvino_wheel_path}
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}"
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/licensing" "${CMAKE_BINARY_DIR}/licensing"
COMMAND ${CMAKE_COMMAND} -E copy_directory "${OpenVINO_SOURCE_DIR}/licensing" "${CMAKE_BINARY_DIR}/licensing"
COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/site-packages"
COMMAND ${CMAKE_COMMAND} -E env WHEEL_VERSION=${WHEEL_VERSION}
WHEEL_BUILD=${WHEEL_BUILD}
CMAKE_BUILD_DIR=${CMAKE_BINARY_DIR}
OV_RUNTIME_LIBS_DIR=${OV_CPACK_RUNTIMEDIR}
TBB_LIBS_DIR=${TBB_LIBS_DIR}
PUGIXML_LIBS_DIR=${PUGIXML_LIBS_DIR}
PY_PACKAGES_DIR=${PY_PACKAGES_DIR}
WHEEL_BUILD=${WHEEL_BUILD}
OPENVINO_BUILD_DIR=${OpenVINO_BINARY_DIR}
OPENVINO_PYTHON_BUILD_DIR=${OpenVINOPython_BINARY_DIR}
OV_RUNTIME_LIBS_DIR=${OV_WHEEL_RUNTIMEDIR}
TBB_LIBS_DIR=${TBB_LIBS_DIR}
PUGIXML_LIBS_DIR=${PUGIXML_LIBS_DIR}
PY_PACKAGES_DIR=${PY_PACKAGES_DIR}
${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/setup.py" clean bdist_wheel
--dist-dir ${openvino_wheels_output_dir}
--build=${WHEEL_BUILD}
--plat-name=${WHEEL_PLATFORM}
--dist-dir ${openvino_wheels_output_dir}
--build=${WHEEL_BUILD}
--plat-name=${WHEEL_PLATFORM}
DEPENDS ${openvino_wheel_deps}
"${CMAKE_CURRENT_SOURCE_DIR}/setup.py"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"

View File

@@ -42,6 +42,8 @@ elif machine == "aarch64" or machine == "arm64":
# The following variables can be defined in environment or .env file
SCRIPT_DIR = Path(__file__).resolve().parents[0]
CMAKE_BUILD_DIR = os.getenv("CMAKE_BUILD_DIR", ".")
OPENVINO_BUILD_DIR = os.getenv("OPENVINO_BUILD_DIR", CMAKE_BUILD_DIR)
OPENVINO_PYTHON_BUILD_DIR = os.getenv("OPENVINO_PYTHON_BUILD_DIR", CMAKE_BUILD_DIR)
OV_RUNTIME_LIBS_DIR = os.getenv("OV_RUNTIME_LIBS_DIR", f"runtime/{LIBS_DIR}/{ARCH}/{CONFIG}")
TBB_LIBS_DIR = os.getenv("TBB_LIBS_DIR", f"runtime/3rdparty/tbb/{LIBS_DIR}")
PUGIXML_LIBS_DIR = os.getenv("PUGIXML_LIBS_DIR", f"runtime/3rdparty/pugixml/{LIBS_DIR}")
@@ -54,70 +56,82 @@ LIB_INSTALL_CFG = {
"prefix": "libs.core",
"install_dir": OV_RUNTIME_LIBS_DIR,
"rpath": LIBS_RPATH,
"binary_dir": OPENVINO_BUILD_DIR,
},
"hetero_plugin": {
"name": "hetero",
"prefix": "libs.core",
"install_dir": OV_RUNTIME_LIBS_DIR,
"rpath": LIBS_RPATH,
"binary_dir": OPENVINO_BUILD_DIR,
},
"gpu_plugin": {
"name": "gpu",
"prefix": "libs.core",
"install_dir": OV_RUNTIME_LIBS_DIR,
"rpath": LIBS_RPATH,
"binary_dir": OPENVINO_BUILD_DIR,
},
"cpu_plugin": {
"name": "cpu",
"prefix": "libs.core",
"install_dir": OV_RUNTIME_LIBS_DIR,
"rpath": LIBS_RPATH,
"binary_dir": OPENVINO_BUILD_DIR,
},
"multi_plugin": {
"name": "multi",
"prefix": "libs.core",
"install_dir": OV_RUNTIME_LIBS_DIR,
"rpath": LIBS_RPATH,
"binary_dir": OPENVINO_BUILD_DIR,
},
"batch_plugin": {
"name": "batch",
"prefix": "libs.core",
"install_dir": OV_RUNTIME_LIBS_DIR,
"rpath": LIBS_RPATH,
"binary_dir": OPENVINO_BUILD_DIR,
},
"tbb_libs": {
"name": "tbb",
"prefix": "libs.tbb",
"install_dir": TBB_LIBS_DIR,
"binary_dir": OPENVINO_BUILD_DIR,
},
"pugixml_libs": {
"name": "pugixml",
"prefix": "libs.pugixml",
"install_dir": PUGIXML_LIBS_DIR,
"binary_dir": OPENVINO_BUILD_DIR,
},
"ir_libs": {
"name": "ir",
"prefix": "libs.core",
"install_dir": OV_RUNTIME_LIBS_DIR,
"rpath": LIBS_RPATH,
"binary_dir": OPENVINO_BUILD_DIR,
},
"paddle_libs": {
"name": "paddle",
"prefix": "libs.core",
"install_dir": OV_RUNTIME_LIBS_DIR,
"rpath": LIBS_RPATH,
"binary_dir": OPENVINO_BUILD_DIR,
},
"onnx_libs": {
"name": "onnx",
"prefix": "libs.core",
"install_dir": OV_RUNTIME_LIBS_DIR,
"rpath": LIBS_RPATH,
"binary_dir": OPENVINO_BUILD_DIR,
},
# uncomment once TF FE will be used in MO
# "tensorflow_libs": { # noqa: E800
# "name": "tensorflow", # noqa: E800
# "prefix": "libs.core", # noqa: E800
# "install_dir": OV_RUNTIME_LIBS_DIR, # noqa: E800
# "binary_dir": OPENVINO_BUILD_DIR, # noqa: E800
# }, # noqa: E800
}
@@ -126,16 +140,19 @@ PY_INSTALL_CFG = {
"name": f"pyie_{PYTHON_VERSION}",
"prefix": "site-packages",
"install_dir": PY_PACKAGES_DIR,
"binary_dir": OPENVINO_PYTHON_BUILD_DIR,
},
"ngraph_py": {
"name": f"pyngraph_{PYTHON_VERSION}",
"prefix": "site-packages",
"install_dir": PY_PACKAGES_DIR,
"binary_dir": OPENVINO_PYTHON_BUILD_DIR,
},
"pyopenvino": {
"name": f"pyopenvino_{PYTHON_VERSION}",
"prefix": "site-packages",
"install_dir": PY_PACKAGES_DIR,
"binary_dir": OPENVINO_PYTHON_BUILD_DIR,
},
}
@@ -193,24 +210,26 @@ class CustomBuild(build):
self.jobs = multiprocessing.cpu_count() if self.jobs is None else int(self.jobs)
def run(self):
global CMAKE_BUILD_DIR
global OPENVINO_BUILD_DIR
self.jobs = multiprocessing.cpu_count()
plat_specifier = ".{0}-{1}.{2}".format(self.plat_name, *sys.version_info[:2])
self.build_temp = os.path.join(self.build_base, "temp" + plat_specifier, self.config)
# if setup.py is directly called use CMake to build product
if CMAKE_BUILD_DIR == ".":
if OPENVINO_BUILD_DIR == ".":
# set path to the root of OpenVINO CMakeList file
openvino_root_dir = Path(__file__).resolve().parents[4]
self.announce(f"Configuring cmake project: {openvino_root_dir}", level=3)
self.spawn(["cmake", "-H" + str(openvino_root_dir), "-B" + self.build_temp,
"-DCMAKE_BUILD_TYPE={type}".format(type=self.config),
"-DENABLE_PYTHON=ON"])
self.spawn(["cmake", "-S" + str(openvino_root_dir),
"-B" + self.build_temp,
"-DCMAKE_BUILD_TYPE={type}".format(type=self.config),
"-DENABLE_PYTHON=ON"])
self.announce("Building binaries", level=3)
self.spawn(["cmake", "--build", self.build_temp,
"--config", self.config, "-j", str(self.jobs)])
CMAKE_BUILD_DIR = self.build_temp
"--config", self.config,
"-j", str(self.jobs)])
OPENVINO_BUILD_DIR = self.build_temp
self.run_command("build_clib")
build.run(self)
@@ -239,10 +258,15 @@ class PrepareLibs(build_clib):
for comp, comp_data in install_cfg.items():
install_prefix = comp_data.get("prefix")
install_dir = comp_data.get("install_dir")
binary_dir = comp_data.get("binary_dir")
if install_dir and not os.path.isabs(install_dir):
install_dir = os.path.join(install_prefix, install_dir)
self.announce(f"Installing {comp}", level=3)
self.spawn(["cmake", "--install", CMAKE_BUILD_DIR, "--prefix", install_prefix, "--component", comp_data.get("name")])
self.spawn(["cmake", "--install", binary_dir,
"--prefix", install_prefix,
"--config", "Release",
"--strip",
"--component", comp_data.get("name")])
# set rpath if applicable
if sys.platform != "win32" and comp_data.get("rpath"):
for path in filter(