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 11 kB

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

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