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.

host_build.sh 9.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. #!/usr/bin/env bash
  2. set -e
  3. function usage() {
  4. echo "$0 args1 args2 .."
  5. echo "available args detail:"
  6. echo "-d : Build with Debug mode, default Release mode"
  7. echo "-c : Build with CUDA, default without CUDA"
  8. echo "-t : Build with training mode, default inference only"
  9. echo "-m : Build with m32 mode(only for windows build), default m64"
  10. echo "-r : remove old build dir before make, default off"
  11. echo "-v : ninja with verbose and explain, default off"
  12. echo "-s : Do not build develop even build with training mode, default on when build with training, always for wheel"
  13. echo "-n : ninja with -n dry run (don't run commands but act like they succeeded)"
  14. echo "-h : show usage"
  15. echo "append other cmake config by export EXTRA_CMAKE_ARGS=..."
  16. echo "example: $0 -d"
  17. exit -1
  18. }
  19. BUILD_TYPE=Release
  20. MGE_WITH_CUDA=OFF
  21. MGE_INFERENCE_ONLY=ON
  22. MGE_WINDOWS_BUILD_ARCH=x64
  23. MGE_WINDOWS_BUILD_MARCH=m64
  24. MGE_ARCH=x86_64
  25. REMOVE_OLD_BUILD=false
  26. NINJA_VERBOSE=OFF
  27. BUILD_DEVELOP=ON
  28. NINJA_DRY_RUN=OFF
  29. echo "EXTRA_CMAKE_ARGS: ${EXTRA_CMAKE_ARGS}"
  30. while getopts "nsrhdctmv" arg
  31. do
  32. case $arg in
  33. d)
  34. echo "Build with Debug mode"
  35. BUILD_TYPE=Debug
  36. ;;
  37. c)
  38. echo "Build with CUDA"
  39. MGE_WITH_CUDA=ON
  40. ;;
  41. t)
  42. echo "Build with training mode"
  43. MGE_INFERENCE_ONLY=OFF
  44. ;;
  45. h)
  46. echo "show usage"
  47. usage
  48. ;;
  49. r)
  50. echo "config REMOVE_OLD_BUILD=true"
  51. REMOVE_OLD_BUILD=true
  52. ;;
  53. s)
  54. echo "config BUILD_DEVELOP=OFF"
  55. BUILD_DEVELOP=OFF
  56. ;;
  57. v)
  58. echo "config NINJA_VERBOSE=ON"
  59. NINJA_VERBOSE=ON
  60. ;;
  61. n)
  62. echo "config NINJA_DRY_RUN=ON"
  63. NINJA_DRY_RUN=ON
  64. ;;
  65. m)
  66. echo "build for m32(only valid use for windows)"
  67. MGE_WINDOWS_BUILD_ARCH=x86
  68. MGE_WINDOWS_BUILD_MARCH=m32
  69. MGE_ARCH=i386
  70. ;;
  71. ?)
  72. echo "unkonw argument"
  73. usage
  74. ;;
  75. esac
  76. done
  77. echo "------------------------------------"
  78. echo "build config summary:"
  79. echo "BUILD_TYPE: $BUILD_TYPE"
  80. echo "MGE_WITH_CUDA: $MGE_WITH_CUDA"
  81. echo "MGE_INFERENCE_ONLY: $MGE_INFERENCE_ONLY"
  82. echo "------------------------------------"
  83. READLINK=readlink
  84. OS=$(uname -s)
  85. if [ $OS = "Darwin" ];then
  86. READLINK=greadlink
  87. if [ $MGE_WITH_CUDA = "ON" ];then
  88. echo "MACOS DO NOT SUPPORT TensorRT, ABORT NOW!!"
  89. exit -1
  90. fi
  91. elif [[ $OS =~ "NT" ]]; then
  92. echo "BUILD in NT ..."
  93. fi
  94. SRC_DIR=$($READLINK -f "`dirname $0`/../../")
  95. source $SRC_DIR/scripts/cmake-build/utils/utils.sh
  96. if [ ${MGE_INFERENCE_ONLY} = "ON" ]; then
  97. echo "config BUILD_DEVELOP=OFF when MGE_INFERENCE_ONLY=ON"
  98. BUILD_DEVELOP=OFF
  99. fi
  100. function cmake_build() {
  101. BUILD_DIR=$SRC_DIR/build_dir/host/MGE_WITH_CUDA_$1/MGE_INFERENCE_ONLY_$2/$3/build
  102. INSTALL_DIR=$BUILD_DIR/../install
  103. MGE_WITH_CUDA=$1
  104. MGE_INFERENCE_ONLY=$2
  105. BUILD_TYPE=$3
  106. echo "build dir: $BUILD_DIR"
  107. echo "install dir: $INSTALL_DIR"
  108. echo "build type: $BUILD_TYPE"
  109. echo "MGE_WITH_CUDA: $MGE_WITH_CUDA"
  110. echo "MGE_INFERENCE_ONLY: $MGE_INFERENCE_ONLY"
  111. try_remove_old_build $REMOVE_OLD_BUILD $BUILD_DIR $INSTALL_DIR
  112. echo "create build dir"
  113. mkdir -p $BUILD_DIR
  114. mkdir -p $INSTALL_DIR
  115. cd_real_build_dir $BUILD_DIR
  116. # fork a new bash to handle EXTRA_CMAKE_ARGS env with space
  117. bash -c "cmake -G Ninja \
  118. -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
  119. -DMGE_INFERENCE_ONLY=$MGE_INFERENCE_ONLY \
  120. -DMGE_WITH_CUDA=$MGE_WITH_CUDA \
  121. -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR \
  122. ${EXTRA_CMAKE_ARGS} \
  123. ${SRC_DIR} "
  124. config_ninja_target_cmd ${NINJA_VERBOSE} ${BUILD_DEVELOP} "install/strip" ${NINJA_DRY_RUN}
  125. bash -c "${NINJA_CMD}"
  126. }
  127. function windows_env_err() {
  128. echo "check windows env failed!!"
  129. echo "please install env refs for: scripts/cmake-build/BUILD_README.md"
  130. exit -1
  131. }
  132. function prepare_env_for_windows_build() {
  133. echo "check Visual Studio install path env..."
  134. if [[ -z $VS_PATH ]];then
  135. echo "can not find visual_studio_path env, pls export you Visual Studio install dir to VS_PATH"
  136. echo "examle for export Visual Studio 2019 Enterprise default install dir"
  137. echo "export VS_PATH=/c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2019/Enterprise"
  138. exit -1
  139. fi
  140. echo $VS_PATH
  141. # only use cmake/clang-cl/Ninja install from Visual Studio, if not, may build failed
  142. # some user env may install cmake/clang-cl/Ninja at MSYS env, so we put Visual Studio
  143. # path at the head of PATH, and check the valid
  144. echo "check cmake install..."
  145. export PATH=$VS_PATH/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin/:$PATH
  146. which cmake
  147. cmake_loc=`which cmake`
  148. if [[ $cmake_loc =~ "Visual" ]]; then
  149. echo "cmake valid ..."
  150. else
  151. echo "cmake Invalid: ..."
  152. windows_env_err
  153. fi
  154. echo "check clang-cl install..."
  155. export PATH=$VS_PATH/VC/Tools/Llvm/bin/:$PATH
  156. which clang-cl
  157. clang_loc=`which clang-cl`
  158. if [[ $clang_loc =~ "Visual" ]]; then
  159. echo "clang-cl valid ..."
  160. else
  161. echo "clang-cl Invalid: ..."
  162. windows_env_err
  163. fi
  164. echo "check Ninja install..."
  165. export PATH=$VS_PATH/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/:$PATH
  166. which Ninja
  167. ninja_loc=`which Ninja`
  168. if [[ $ninja_loc =~ "Visual" ]]; then
  169. echo "Ninja valid ..."
  170. else
  171. echo "Ninja Invalid: ..."
  172. windows_env_err
  173. fi
  174. echo "put vcvarsall.bat path to PATH env.."
  175. export PATH=$VS_PATH/VC/Auxiliary/Build:$PATH
  176. echo "config cuda/cudnn/TensorRT env..."
  177. export NIVIDA_INSTALL_PRE=/c/Program\ Files/NVIDIA\ GPU\ Computing\ Toolkit
  178. export CUDA_V=v10.1
  179. export CUDNN_V=cudnn-10.1-windows10-x64-v7.6.5.32
  180. export TRT_V=TensorRT-6.0.1.5
  181. export CUDA_PATH=$NIVIDA_INSTALL_PRE/CUDA/${CUDA_V}
  182. export PATH=$PATH:$CUDA_PATH/bin
  183. export CUDA_BIN_PATH=$CUDA_PATH
  184. export PC_CUDNN_INCLUDE_DIRS=$NIVIDA_INSTALL_PRE/${CUDNN_V}/cuda/include
  185. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NIVIDA_INSTALL_PRE/${TRT_V}/lib:$NIVIDA_INSTALL_PRE/CUDA/${CUDA_V}/lib/x64:$NIVIDA_INSTALL_PRE/${CUDNN_V}/cuda/lib/x64
  186. export CPATH=$CPATH:$NIVIDA_INSTALL_PRE/${TRT_V}/include:$NIVIDA_INSTALL_PRE/CUDA/${CUDA_V}/include:$NIVIDA_INSTALL_PRE/CUDA/${CUDA_V}/include/nvtx3:$PC_CUDNN_INCLUDE_DIRS
  187. export LIBRARY_PATH=$LIBRARY_PATH:$LD_LIBRARY_PATH
  188. export INCLUDE=$INCLUDE:$CPATH
  189. export CUDNN_ROOT_DIR=${NIVIDA_INSTALL_PRE}/${CUDNN_V}/cuda
  190. export TRT_ROOT_DIR=${NIVIDA_INSTALL_PRE}/${TRT_V}
  191. # python version will be config by whl build script or ci script, we need
  192. # a DFT version for build success when we just call host_build.sh
  193. if [[ -z ${ALREADY_CONFIG_PYTHON_VER} ]]
  194. then
  195. echo "config a default python3"
  196. DFT_PYTHON_BIN=/c/Users/${USER}/mge_whl_python_env/3.8.3
  197. if [ ! -f "${DFT_PYTHON_BIN}/python3.exe" ]; then
  198. echo "ERR: can not find ${DFT_PYTHON_BIN}/python3.exe , Invalid env"
  199. windows_env_err
  200. else
  201. echo "put python3 to env..."
  202. export PATH=${DFT_PYTHON_BIN}:$PATH
  203. which python3
  204. fi
  205. fi
  206. echo "export swig pwd to PATH"
  207. export PATH=/c/Users/${USER}/swigwin-4.0.2::$PATH
  208. }
  209. function cmake_build_windows() {
  210. # windows do not support long path, so we cache the BUILD_DIR ASAP
  211. prepare_env_for_windows_build
  212. BUILD_DIR=$SRC_DIR/build_dir/host/build
  213. INSTALL_DIR=$BUILD_DIR/../install
  214. MGE_WITH_CUDA=$1
  215. MGE_INFERENCE_ONLY=$2
  216. BUILD_TYPE=$3
  217. echo "build dir: $BUILD_DIR"
  218. echo "install dir: $INSTALL_DIR"
  219. echo "build type: $BUILD_TYPE"
  220. echo "MGE_WITH_CUDA: $MGE_WITH_CUDA"
  221. echo "MGE_INFERENCE_ONLY: $MGE_INFERENCE_ONLY"
  222. try_remove_old_build $REMOVE_OLD_BUILD $BUILD_DIR $INSTALL_DIR
  223. echo "create build dir"
  224. mkdir -p $BUILD_DIR
  225. mkdir -p $INSTALL_DIR
  226. cd_real_build_dir $BUILD_DIR
  227. echo "now try build windows native with cmake/clang-ci/Ninja/Visual Studio ....."
  228. export CFLAGS=-$MGE_WINDOWS_BUILD_MARCH
  229. export CXXFLAGS=-$MGE_WINDOWS_BUILD_MARCH
  230. cmd.exe /c " \
  231. vcvarsall.bat $MGE_WINDOWS_BUILD_ARCH && cmake -G "Ninja" \
  232. -DMGE_ARCH=$MGE_ARCH \
  233. -DMGE_INFERENCE_ONLY=$MGE_INFERENCE_ONLY \
  234. -DMGE_WITH_CUDA=$MGE_WITH_CUDA \
  235. -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
  236. -DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_DIR \
  237. -DCMAKE_C_COMPILER=clang-cl.exe \
  238. -DCMAKE_CXX_COMPILER=clang-cl.exe \
  239. -DCMAKE_MAKE_PROGRAM=ninja.exe \
  240. ${EXTRA_CMAKE_ARGS} ../../.. "
  241. config_ninja_target_cmd ${NINJA_VERBOSE} ${BUILD_DEVELOP} "" ${NINJA_DRY_RUN}
  242. cmd.exe /c " vcvarsall.bat $MGE_WINDOWS_BUILD_ARCH && ${NINJA_CMD} "
  243. }
  244. if [[ $OS =~ "NT" ]]; then
  245. if [ ${MGE_ARCH} = "i386" ] && [ ${MGE_INFERENCE_ONLY} = "OFF" ]; then
  246. echo "ERR: training mode(-t) only support 64 bit mode"
  247. echo "pls remove -t or remove -m"
  248. exit -1
  249. fi
  250. cmake_build_windows $MGE_WITH_CUDA $MGE_INFERENCE_ONLY $BUILD_TYPE
  251. else
  252. cmake_build $MGE_WITH_CUDA $MGE_INFERENCE_ONLY $BUILD_TYPE
  253. fi

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