You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

macos_build_whl.sh 9.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. #!/bin/bash -e
  2. READLINK=readlink
  3. OS=$(uname -s)
  4. USER=$(whoami)
  5. if [ $OS = "Darwin" ];then
  6. READLINK=greadlink
  7. else
  8. echo "ERR: only run at macos env"
  9. exit -1
  10. fi
  11. function err_env() {
  12. echo "check_env failed: pls refs ${SRC_DIR}/scripts/whl/BUILD_PYTHON_WHL_README.md"
  13. echo "try call ./scripts/whl/macos/macos_whl_env_prepare.sh to init env"
  14. exit -1
  15. }
  16. function append_path_env_and_check() {
  17. export PATH=/usr/local/opt/findutils/libexec/gnubin:$PATH
  18. export PATH=/usr/local/opt/binutils/bin:$PATH
  19. export PATH=/usr/local/opt/llvm/bin:$PATH
  20. export PATH=/Users/${USER}/megengine_use_cmake/install/bin:$PATH
  21. if [ ! -f "/usr/local/opt/llvm/bin/llvm-strip" ]; then
  22. err_env
  23. fi
  24. which cmake
  25. if [ ! -f "/Users/${USER}/megengine_use_cmake/install/bin/cmake" ]; then
  26. err_env
  27. fi
  28. }
  29. append_path_env_and_check
  30. SRC_DIR=$($READLINK -f "`dirname $0`/../../../")
  31. source ${SRC_DIR}/scripts/whl/utils/utils.sh
  32. ALL_PYTHON=${ALL_PYTHON}
  33. FULL_PYTHON_VER="3.5.9 3.6.10 3.7.7 3.8.3"
  34. if [[ -z ${ALL_PYTHON} ]]
  35. then
  36. ALL_PYTHON=${FULL_PYTHON_VER}
  37. else
  38. check_python_version_is_valid "${ALL_PYTHON}" "${FULL_PYTHON_VER}"
  39. fi
  40. PYTHON_DIR=
  41. PYTHON_LIBRARY=
  42. PYTHON_INCLUDE_DIR=
  43. MACOS_WHL_HOME=${SRC_DIR}/scripts/whl/macos/macos_whl_home
  44. if [ -e "${MACOS_WHL_HOME}" ]; then
  45. echo "remove old macos whl file"
  46. rm -rf ${MACOS_WHL_HOME}
  47. fi
  48. mkdir -p ${MACOS_WHL_HOME}
  49. function config_python_env() {
  50. PYTHON_DIR=/Users/${USER}/.pyenv/versions/$1/
  51. PYTHON_BIN=/Users/${USER}/.pyenv/versions/$1/bin
  52. if [ ! -f "$PYTHON_BIN/python3" ]; then
  53. echo "ERR: can not find $PYTHON_BIN , Invalid python package"
  54. echo "now support list: ${FULL_PYTHON_VER}"
  55. err_env
  56. else
  57. echo "put python3 to env..."
  58. export PATH=${PYTHON_BIN}:$PATH
  59. which python3
  60. fi
  61. echo ${ver}
  62. if [ "$1" = "3.5.9" ]; then
  63. PYTHON_INCLUDE_DIR=${PYTHON_DIR}include/python3.5m
  64. PYTHON_LIBRARY=${PYTHON_DIR}/lib/libpython3.5m.dylib
  65. elif [ "$1" = "3.6.10" ]; then
  66. PYTHON_INCLUDE_DIR=${PYTHON_DIR}include/python3.6m
  67. PYTHON_LIBRARY=${PYTHON_DIR}/lib/libpython3.6m.dylib
  68. elif [ "$1" = "3.7.7" ]; then
  69. PYTHON_INCLUDE_DIR=${PYTHON_DIR}include/python3.7m
  70. PYTHON_LIBRARY=${PYTHON_DIR}/lib/libpython3.7m.dylib
  71. elif [ "$1" = "3.8.3" ]; then
  72. PYTHON_INCLUDE_DIR=${PYTHON_DIR}include/python3.8
  73. PYTHON_LIBRARY=${PYTHON_DIR}/lib/libpython3.8.dylib
  74. else
  75. echo "ERR: DO NOT SUPPORT PYTHON VERSION"
  76. echo "now support list: ${FULL_PYTHON_VER}"
  77. exit -1
  78. fi
  79. }
  80. MEGENGINE_LIB="${SRC_DIR}/build_dir/host/MGE_WITH_CUDA_OFF/MGE_INFERENCE_ONLY_OFF/Release/build/src/libmegengine_export.dylib"
  81. function depend_real_copy() {
  82. REAL_DST=$1
  83. echo "real copy lib to $1"
  84. cp "${MEGENGINE_LIB}" ${REAL_DST}
  85. }
  86. BUILD_DIR=${SRC_DIR}/build_dir/host/MGE_WITH_CUDA_OFF/MGE_INFERENCE_ONLY_OFF/Release/build/
  87. # here we just treat dnn/src/common/conv_bias.cpp should not in the increment build file list
  88. INCREMENT_KEY_WORDS="conv_bias.cpp.o is dirty"
  89. IS_IN_FIRST_LOOP=TRUE
  90. ORG_EXTRA_CMAKE_FLAG=${EXTRA_CMAKE_FLAG}
  91. function do_build() {
  92. for ver in ${ALL_PYTHON}
  93. do
  94. # we want run a full clean build at the first loop
  95. if [ ${IS_IN_FIRST_LOOP} = "TRUE" ]; then
  96. # TODO: may all cmake issue can be resolved after rm CMakeCache?
  97. # if YES, remove this to use old cache and speed up CI
  98. echo "warning: remove old build_dir for the first loop"
  99. rm -rf ${BUILD_DIR}
  100. fi
  101. #config
  102. config_python_env ${ver}
  103. #check env
  104. if [ ! -f "$PYTHON_LIBRARY" ]; then
  105. echo "ERR: can not find $PYTHON_LIBRARY , Invalid python package"
  106. err_env
  107. fi
  108. if [ ! -d "$PYTHON_INCLUDE_DIR" ]; then
  109. echo "ERR: can not find $PYTHON_INCLUDE_DIR , Invalid python package"
  110. err_env
  111. fi
  112. echo "PYTHON_LIBRARY: ${PYTHON_LIBRARY}"
  113. echo "PYTHON_INCLUDE_DIR: ${PYTHON_INCLUDE_DIR}"
  114. #config build type to RelWithDebInfo to enable MGB_ENABLE_DEBUG_UTIL etc
  115. export EXTRA_CMAKE_ARGS="${ORG_EXTRA_CMAKE_FLAG} -DCMAKE_BUILD_TYPE=RelWithDebInfo"
  116. #append cmake args for config python
  117. export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DPYTHON_EXECUTABLE=${PYTHON_DIR}/bin/python3"
  118. export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DPYTHON_LIBRARY=${PYTHON_LIBRARY}"
  119. export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DPYTHON_INCLUDE_DIR=${PYTHON_INCLUDE_DIR}"
  120. #we use std::visit in src, so set osx version minimum to 10.14, but 10.14 have objdump
  121. #issue, so we now config to 10.15, whl name to 10.14
  122. #TODO: can set to 10.12 after remove use std::visit
  123. export EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 "
  124. if [ -d "${BUILD_DIR}" ]; then
  125. # insure rm have args
  126. touch ${BUILD_DIR}/empty.so
  127. touch ${BUILD_DIR}/CMakeCache.txt
  128. find ${BUILD_DIR} -name "*.so" | xargs rm
  129. # as we now use increment build mode when switch python
  130. # But I do not known any more issue at CMakeLists.txt or not
  131. # so Force remove CMakeCache.txt
  132. find ${BUILD_DIR} -name CMakeCache.txt | xargs rm
  133. fi
  134. HOST_BUILD_ARGS="-t -s"
  135. # call ninja dry run and check increment is invalid or not
  136. if [ ${IS_IN_FIRST_LOOP} = "FALSE" ]; then
  137. ninja_dry_run_and_check_increment "${SRC_DIR}/scripts/cmake-build/host_build.sh" "${HOST_BUILD_ARGS}" "${INCREMENT_KEY_WORDS}"
  138. fi
  139. # call real build
  140. echo "host_build.sh HOST_BUILD_ARGS: ${HOST_BUILD_ARGS}"
  141. ${SRC_DIR}/scripts/cmake-build/host_build.sh ${HOST_BUILD_ARGS}
  142. # check python api call setup.py
  143. cd ${BUILD_DIR}
  144. check_build_ninja_python_api ${ver}
  145. rm -rf staging
  146. mkdir -p staging
  147. cp -a imperative/python/{megengine,setup.py,requires.txt,requires-style.txt,requires-test.txt} staging/
  148. cd ${BUILD_DIR}/staging/megengine/core
  149. rt_file=`ls _imperative_rt.*.so`
  150. echo "rt file is: ${rt_file}"
  151. if [[ -z ${rt_file} ]]
  152. then
  153. echo "ERR: can not find valid rt file"
  154. exit -1
  155. fi
  156. llvm-strip -s ${rt_file}
  157. mv ${rt_file} _imperative_rt.so
  158. echo "check so valid or not..."
  159. otool_out=`otool -L _imperative_rt.so`
  160. if [[ "${otool_out}" =~ "ython" ]]; then
  161. echo "ERR: invalid _imperative_rt.so which depend on python lib, detail: log"
  162. echo ${otool_out}
  163. exit -1
  164. else
  165. echo "valid..."
  166. fi
  167. #handle dlopen path
  168. install_name_tool -change @rpath/libmegengine_export.dylib @loader_path/lib/libmegengine_export.dylib _imperative_rt.so
  169. #copy megbrain_export lib
  170. DEPEND_LIB=${BUILD_DIR}/staging/megengine/core/lib/
  171. rm -rf ${DEPEND_LIB}
  172. mkdir ${DEPEND_LIB}
  173. depend_real_copy ${DEPEND_LIB}
  174. cd ${BUILD_DIR}/staging
  175. ${PYTHON_DIR}/bin/python3 setup.py bdist_wheel
  176. cd ${BUILD_DIR}/staging/dist/
  177. org_whl_name=`ls Meg*.whl`
  178. index=`awk -v a="${org_whl_name}" -v b="-macosx" 'BEGIN{print index(a,b)}'`
  179. compat_whl_name=`echo ${org_whl_name} |cut -b -$index`macosx_10_14_x86_64.whl
  180. echo "org whl name: ${org_whl_name}"
  181. echo "comapt whl name: ${compat_whl_name}"
  182. cp ${BUILD_DIR}/staging/dist/Meg*.whl ${MACOS_WHL_HOME}/${compat_whl_name}
  183. # handle megenginelite
  184. cd ${BUILD_DIR}
  185. rm -rf lite_staging
  186. mkdir -p lite_staging/megenginelite
  187. cp ${SRC_DIR}/lite/pylite/megenginelite/* lite_staging/megenginelite/
  188. cp ${SRC_DIR}/lite/pylite/setup.py lite_staging/
  189. cp ${SRC_DIR}/lite/pylite/requires.txt lite_staging/
  190. VER_FILE=${SRC_DIR}/imperative/python/megengine/version.py
  191. if [ -f ${VER_FILE} ];then
  192. cp ${VER_FILE} lite_staging/megenginelite
  193. else
  194. echo "ERROR: can not find version file"
  195. exit -1
  196. fi
  197. mkdir -p ${BUILD_DIR}/lite_staging/megenginelite/libs
  198. LITE_LIB=${BUILD_DIR}/lite_staging/megenginelite/libs/liblite_shared.dylib
  199. cp ${SRC_DIR}/build_dir/host/MGE_WITH_CUDA_OFF/MGE_INFERENCE_ONLY_OFF/Release/build/lite/liblite_shared.dylib ${LITE_LIB}
  200. llvm-strip -s ${LITE_LIB}
  201. cd ${BUILD_DIR}/lite_staging/
  202. ${PYTHON_DIR}/bin/python3 setup.py bdist_wheel
  203. cd ${BUILD_DIR}/lite_staging/dist/
  204. org_whl_name=`ls Meg*.whl`
  205. index=`awk -v a="${org_whl_name}" -v b="-macosx" 'BEGIN{print index(a,b)}'`
  206. compat_whl_name=`echo ${org_whl_name} |cut -b -$index`macosx_10_14_x86_64.whl
  207. echo "megenginelite org whl name: ${org_whl_name}"
  208. echo "megenginelite comapt whl name: ${compat_whl_name}"
  209. cp ${BUILD_DIR}/lite_staging/dist/Meg*.whl ${MACOS_WHL_HOME}/${compat_whl_name}
  210. cd ${SRC_DIR}
  211. echo ""
  212. echo "##############################################################################################"
  213. echo "macos whl package location: ${MACOS_WHL_HOME}"
  214. ls ${MACOS_WHL_HOME}
  215. echo "##############################################################################################"
  216. IS_IN_FIRST_LOOP=FALSE
  217. done
  218. }
  219. function third_party_prepare() {
  220. echo "init third_party..."
  221. ${SRC_DIR}/third_party/prepare.sh
  222. if [[ -z ${ALREADY_INSTALL_MKL} ]]
  223. then
  224. echo "init third_party..."
  225. ${SRC_DIR}/third_party/install-mkl.sh
  226. else
  227. echo "skip init mkl internal"
  228. fi
  229. }
  230. ######################
  231. third_party_prepare
  232. do_build

MegEngine 安装包中集成了使用 GPU 运行代码所需的 CUDA 环境,不用区分 CPU 和 GPU 版。 如果想要运行 GPU 程序,请确保机器本身配有 GPU 硬件设备并安装好驱动。 如果你想体验在云端 GPU 算力平台进行深度学习开发的感觉,欢迎访问 MegStudio 平台