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.

build.sh 12 kB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
4 years ago
4 years ago
5 years ago
5 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. #!/bin/bash
  2. # Copyright 2019-2020 Huawei Technologies Co., Ltd
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. # ============================================================================
  16. set -e
  17. BASEPATH=$(cd "$(dirname $0)"; pwd)
  18. OUTPUT_PATH="${BASEPATH}/output"
  19. export BUILD_PATH="${BASEPATH}/build/"
  20. # print usage message
  21. usage()
  22. {
  23. echo "Usage:"
  24. echo "sh build.sh [-j[n]] [-h] [-v] [-s] [-t] [-u] [-c] [-S on|off] [-M]"
  25. echo ""
  26. echo "Options:"
  27. echo " -h Print usage"
  28. echo " -u Only compile ut, not execute"
  29. echo " -s Build st"
  30. echo " -j[n] Set the number of threads used for building GraphEngine, default is 8"
  31. echo " -t Build and execute ut"
  32. echo " -c Build ut with coverage tag"
  33. echo " -p Build inference or train"
  34. echo " -v Display build command"
  35. echo " -S Enable enable download cmake compile dependency from gitee , default off"
  36. echo " -M build MindSpore mode"
  37. echo "to be continued ..."
  38. }
  39. # check value of input is 'on' or 'off'
  40. # usage: check_on_off arg_value arg_name
  41. check_on_off()
  42. {
  43. if [[ "X$1" != "Xon" && "X$1" != "Xoff" ]]; then
  44. echo "Invalid value $1 for option -$2"
  45. usage
  46. exit 1
  47. fi
  48. }
  49. # parse and set options
  50. checkopts()
  51. {
  52. VERBOSE=""
  53. THREAD_NUM=8
  54. # ENABLE_GE_UT_ONLY_COMPILE="off"
  55. ENABLE_GE_UT="off"
  56. ENABLE_GE_ST="off"
  57. ENABLE_GE_COV="off"
  58. PLATFORM=""
  59. PRODUCT="normal"
  60. ENABLE_GITEE="off"
  61. MINDSPORE_MODE="off"
  62. # Process the options
  63. while getopts 'ustchj:p:g:vS:M' opt
  64. do
  65. OPTARG=$(echo ${OPTARG} | tr '[A-Z]' '[a-z]')
  66. case "${opt}" in
  67. u)
  68. # ENABLE_GE_UT_ONLY_COMPILE="on"
  69. ENABLE_GE_UT="on"
  70. ;;
  71. s)
  72. ENABLE_GE_ST="on"
  73. ;;
  74. t)
  75. ENABLE_GE_UT="on"
  76. ;;
  77. c)
  78. ENABLE_GE_COV="on"
  79. ;;
  80. h)
  81. usage
  82. exit 0
  83. ;;
  84. j)
  85. THREAD_NUM=$OPTARG
  86. ;;
  87. v)
  88. VERBOSE="VERBOSE=1"
  89. ;;
  90. p)
  91. PLATFORM=$OPTARG
  92. ;;
  93. g)
  94. PRODUCT=$OPTARG
  95. ;;
  96. S)
  97. check_on_off $OPTARG S
  98. ENABLE_GITEE="$OPTARG"
  99. echo "enable download from gitee"
  100. ;;
  101. M)
  102. MINDSPORE_MODE="on"
  103. ;;
  104. *)
  105. echo "Undefined option: ${opt}"
  106. usage
  107. exit 1
  108. esac
  109. done
  110. }
  111. checkopts "$@"
  112. git submodule update --init metadef
  113. git submodule update --init parser
  114. mk_dir() {
  115. local create_dir="$1" # the target to make
  116. mkdir -pv "${create_dir}"
  117. echo "created ${create_dir}"
  118. }
  119. # GraphEngine build start
  120. echo "---------------- GraphEngine build start ----------------"
  121. # create build path
  122. build_graphengine()
  123. {
  124. echo "create build directory and build GraphEngine";
  125. mk_dir "${BUILD_PATH}"
  126. cd "${BUILD_PATH}"
  127. CMAKE_ARGS="-DBUILD_PATH=$BUILD_PATH"
  128. if [[ "X$ENABLE_GE_COV" = "Xon" ]]; then
  129. CMAKE_ARGS="${CMAKE_ARGS} -DENABLE_GE_COV=ON"
  130. fi
  131. if [[ "X$ENABLE_GE_UT" = "Xon" ]]; then
  132. CMAKE_ARGS="${CMAKE_ARGS} -DENABLE_GE_UT=ON"
  133. fi
  134. if [[ "X$ENABLE_GE_ST" = "Xon" ]]; then
  135. CMAKE_ARGS="${CMAKE_ARGS} -DENABLE_GE_ST=ON"
  136. fi
  137. if [[ "X$ENABLE_GITEE" = "Xon" ]]; then
  138. CMAKE_ARGS="${CMAKE_ARGS} -DENABLE_GITEE=ON"
  139. fi
  140. if [[ "X$MINDSPORE_MODE" = "Xoff" ]]; then
  141. CMAKE_ARGS="${CMAKE_ARGS} -DENABLE_OPEN_SRC=True -DCMAKE_INSTALL_PREFIX=${OUTPUT_PATH} -DPLATFORM=${PLATFORM} -DPRODUCT=${PRODUCT}"
  142. else
  143. CMAKE_ARGS="${CMAKE_ARGS} -DENABLE_D=ON -DCMAKE_INSTALL_PREFIX=${OUTPUT_PATH}"
  144. fi
  145. echo "${CMAKE_ARGS}"
  146. cmake ${CMAKE_ARGS} ..
  147. if [ $? -ne 0 ]
  148. then
  149. echo "execute command: cmake ${CMAKE_ARGS} .. failed."
  150. return 1
  151. fi
  152. COMMON_TARGET="ge_local_engine ge_local_opskernel_builder host_cpu_engine host_cpu_opskernel_builder ge_common engine fmk_parser parser_common _caffe_parser fmk_onnx_parser graph register engine_conf.json optimizer_priority.pbtxt "
  153. TARGET=${COMMON_TARGET}
  154. if [ "x${PLATFORM}" = "xtrain" ]
  155. then
  156. TARGET="ge_runner fwk_atc.bin ${TARGET}"
  157. elif [ "x${PLATFORM}" = "xinference" ]
  158. then
  159. TARGET="ge_compiler atc_atc.bin opensrc_ascendcl ${TARGET}"
  160. elif [ "X$ENABLE_GE_UT" = "Xon" ]
  161. then
  162. TARGET="ut_libgraph ut_libge_multiparts_utest ut_libge_others_utest ut_libge_kernel_utest ut_libge_distinct_load_utest"
  163. elif [ "X$MINDSPORE_MODE" = "Xon" ]
  164. then
  165. TARGET="ge_common graph"
  166. elif [ "x${PLATFORM}" = "xall" ]
  167. then
  168. # build all the target
  169. TARGET="ge_runner ge_compiler fwk_atc.bin atc_atc.bin opensrc_ascendcl ${TARGET}"
  170. fi
  171. make ${VERBOSE} ${TARGET} -j${THREAD_NUM} && make install
  172. if [ $? -ne 0 ]
  173. then
  174. echo "execute command: make ${VERBOSE} -j${THREAD_NUM} && make install failed."
  175. return 1
  176. fi
  177. echo "GraphEngine build success!"
  178. }
  179. g++ -v
  180. mk_dir ${OUTPUT_PATH}
  181. build_graphengine || { echo "GraphEngine build failed."; return; }
  182. echo "---------------- GraphEngine build finished ----------------"
  183. rm -f ${OUTPUT_PATH}/libgmock*.so
  184. rm -f ${OUTPUT_PATH}/libgtest*.so
  185. rm -f ${OUTPUT_PATH}/lib*_stub.so
  186. chmod -R 750 ${OUTPUT_PATH}
  187. find ${OUTPUT_PATH} -name "*.so*" -print0 | xargs -0 chmod 500
  188. echo "---------------- GraphEngine output generated ----------------"
  189. if [[ "X$ENABLE_GE_UT" = "Xon" || "X$ENABLE_GE_COV" = "Xon" ]]; then
  190. cp ${BUILD_PATH}/tests/ut/common/graph/ut_libgraph ${OUTPUT_PATH}
  191. cp ${BUILD_PATH}/tests/ut/ge/ut_libge_multiparts_utest ${OUTPUT_PATH}
  192. cp ${BUILD_PATH}/tests/ut/ge/ut_libge_distinct_load_utest ${OUTPUT_PATH}
  193. cp ${BUILD_PATH}/tests/ut/ge/ut_libge_others_utest ${OUTPUT_PATH}
  194. cp ${BUILD_PATH}/tests/ut/ge/ut_libge_kernel_utest ${OUTPUT_PATH}
  195. RUN_TEST_CASE=${OUTPUT_PATH}/ut_libgraph && ${RUN_TEST_CASE} &&
  196. RUN_TEST_CASE=${OUTPUT_PATH}/ut_libge_multiparts_utest && ${RUN_TEST_CASE} &&
  197. RUN_TEST_CASE=${OUTPUT_PATH}/ut_libge_distinct_load_utest && ${RUN_TEST_CASE} &&
  198. RUN_TEST_CASE=${OUTPUT_PATH}/ut_libge_others_utest && ${RUN_TEST_CASE} &&
  199. RUN_TEST_CASE=${OUTPUT_PATH}/ut_libge_kernel_utest && ${RUN_TEST_CASE}
  200. if [[ "$?" -ne 0 ]]; then
  201. echo "!!! UT FAILED, PLEASE CHECK YOUR CHANGES !!!"
  202. echo -e "\033[31m${RUN_TEST_CASE}\033[0m"
  203. exit 1;
  204. fi
  205. echo "Generating coverage statistics, please wait..."
  206. cd ${BASEPATH}
  207. rm -rf ${BASEPATH}/cov
  208. mkdir ${BASEPATH}/cov
  209. lcov -c -d build/tests/ut/ge -d build/tests/ut/common/graph/ -o cov/tmp.info
  210. lcov -r cov/tmp.info '*/output/*' '*/build/opensrc/*' '*/build/proto/*' '*/third_party/*' '*/tests/*' '/usr/local/*' '/usr/include/*' '*/metadef/*' '*/parser/*' -o cov/coverage.info
  211. cd ${BASEPATH}/cov
  212. genhtml coverage.info
  213. fi
  214. # generate output package in tar form, including ut/st libraries/executables
  215. generate_package()
  216. {
  217. cd "${BASEPATH}"
  218. GRAPHENGINE_LIB_PATH="lib"
  219. ACL_PATH="acllib/lib64"
  220. FWK_PATH="fwkacllib/lib64"
  221. ATC_PATH="atc/lib64"
  222. ATC_BIN_PATH="atc/bin"
  223. FWK_BIN_PATH="fwkacllib/bin"
  224. FWK_INCLUDE_PATH="fwkacllib/include"
  225. ATC_INCLUDE_PATH="atc/include"
  226. NNENGINE_PATH="plugin/nnengine/ge_config"
  227. OPSKERNEL_PATH="plugin/opskernel"
  228. ATC_LIB=("libc_sec.so" "libge_common.so" "libge_compiler.so" "libgraph.so" "libregister.so" "liberror_manager.so")
  229. FWK_LIB=("libge_common.so" "libge_runner.so" "libgraph.so" "libregister.so" "liberror_manager.so")
  230. PLUGIN_OPSKERNEL=("libge_local_engine.so" "libge_local_opskernel_builder.so" "libhost_cpu_engine.so" "libhost_cpu_opskernel_builder.so" "optimizer_priority.pbtxt")
  231. PARSER_LIB=("lib_caffe_parser.so" "libfmk_onnx_parser.so" "libfmk_parser.so" "libparser_common.so")
  232. rm -rf ${OUTPUT_PATH:?}/${FWK_PATH}/
  233. rm -rf ${OUTPUT_PATH:?}/${ACL_PATH}/
  234. rm -rf ${OUTPUT_PATH:?}/${ATC_PATH}/
  235. rm -rf ${OUTPUT_PATH:?}/${ATC_BIN_PATH}/
  236. rm -rf ${OUTPUT_PATH:?}/${FWK_BIN_PATH}/
  237. mk_dir "${OUTPUT_PATH}/${FWK_PATH}/${NNENGINE_PATH}"
  238. mk_dir "${OUTPUT_PATH}/${FWK_PATH}/${OPSKERNEL_PATH}"
  239. mk_dir "${OUTPUT_PATH}/${ATC_PATH}/${NNENGINE_PATH}"
  240. mk_dir "${OUTPUT_PATH}/${ATC_PATH}/${OPSKERNEL_PATH}"
  241. mk_dir "${OUTPUT_PATH}/${ACL_PATH}"
  242. mk_dir "${OUTPUT_PATH}/${ATC_BIN_PATH}"
  243. mk_dir "${OUTPUT_PATH}/${FWK_BIN_PATH}"
  244. mk_dir "${OUTPUT_PATH}/${FWK_INCLUDE_PATH}"
  245. mk_dir "${OUTPUT_PATH}/${ATC_INCLUDE_PATH}"
  246. cd "${OUTPUT_PATH}"
  247. find ./ -name graphengine_lib.tar -exec rm {} \;
  248. cp ${OUTPUT_PATH}/${GRAPHENGINE_LIB_PATH}/engine_conf.json ${OUTPUT_PATH}/${FWK_PATH}/${NNENGINE_PATH}
  249. cp ${OUTPUT_PATH}/${GRAPHENGINE_LIB_PATH}/engine_conf.json ${OUTPUT_PATH}/${ATC_PATH}/${NNENGINE_PATH}
  250. find ${OUTPUT_PATH}/${GRAPHENGINE_LIB_PATH} -maxdepth 1 -name libengine.so -exec cp -f {} ${OUTPUT_PATH}/${FWK_PATH}/${NNENGINE_PATH}/../ \;
  251. find ${OUTPUT_PATH}/${GRAPHENGINE_LIB_PATH} -maxdepth 1 -name libengine.so -exec cp -f {} ${OUTPUT_PATH}/${ATC_PATH}/${NNENGINE_PATH}/../ \;
  252. MAX_DEPTH=1
  253. # if [ "x${PLATFORM}" = "xall" ] || [ "x${PLATFORM}" = "xinference" ]
  254. # then
  255. # MAX_DEPTH=2
  256. # fi
  257. for lib in "${PLUGIN_OPSKERNEL[@]}";
  258. do
  259. find ${OUTPUT_PATH}/${GRAPHENGINE_LIB_PATH} -maxdepth ${MAX_DEPTH} -name "$lib" -exec cp -f {} ${OUTPUT_PATH}/${FWK_PATH}/${OPSKERNEL_PATH} \;
  260. find ${OUTPUT_PATH}/${GRAPHENGINE_LIB_PATH} -maxdepth ${MAX_DEPTH} -name "$lib" -exec cp -f {} ${OUTPUT_PATH}/${ATC_PATH}/${OPSKERNEL_PATH} \;
  261. done
  262. for lib in "${PARSER_LIB[@]}";
  263. do
  264. find ${OUTPUT_PATH}/${GRAPHENGINE_LIB_PATH} -maxdepth 1 -name "$lib" -exec cp -f {} ${OUTPUT_PATH}/${FWK_PATH} \;
  265. find ${OUTPUT_PATH}/${GRAPHENGINE_LIB_PATH} -maxdepth 1 -name "$lib" -exec cp -f {} ${OUTPUT_PATH}/${ATC_PATH} \;
  266. done
  267. for lib in "${FWK_LIB[@]}";
  268. do
  269. find ${OUTPUT_PATH}/${GRAPHENGINE_LIB_PATH} -maxdepth 1 -name "$lib" -exec cp -f {} ${OUTPUT_PATH}/${FWK_PATH} \;
  270. done
  271. for lib in "${ATC_LIB[@]}";
  272. do
  273. find ${OUTPUT_PATH}/${GRAPHENGINE_LIB_PATH} -maxdepth 1 -name "$lib" -exec cp -f {} ${OUTPUT_PATH}/${ATC_PATH} \;
  274. done
  275. find ./lib/atclib -name atc.bin -exec cp {} "${OUTPUT_PATH}/${ATC_BIN_PATH}" \;
  276. find ./lib/fwkacl -name atc.bin -exec cp {} "${OUTPUT_PATH}/${FWK_BIN_PATH}" \;
  277. find ${OUTPUT_PATH}/${GRAPHENGINE_LIB_PATH} -maxdepth 1 -name "libascendcl.so" -exec cp -f {} ${OUTPUT_PATH}/${ACL_PATH} \;
  278. cp -r ${OUTPUT_PATH}/../metadef/inc/external/* ${ATC_INCLUDE_PATH}
  279. cp -r ${OUTPUT_PATH}/../parser/inc/external/* ${ATC_INCLUDE_PATH}
  280. cp -r ${OUTPUT_PATH}/../inc/external/* ${ATC_INCLUDE_PATH}
  281. cp -r ${OUTPUT_PATH}/../metadef/inc/external/* ${FWK_INCLUDE_PATH}
  282. cp -r ${OUTPUT_PATH}/../parser/inc/external/* ${FWK_INCLUDE_PATH}
  283. cp -r ${OUTPUT_PATH}/../inc/external/* ${FWK_INCLUDE_PATH}
  284. if [ "x${PLATFORM}" = "xtrain" ]
  285. then
  286. tar -cf graphengine_lib.tar fwkacllib
  287. elif [ "x${PLATFORM}" = "xinference" ]
  288. then
  289. tar -cf graphengine_lib.tar acllib atc
  290. elif [ "x${PLATFORM}" = "xall" ]
  291. then
  292. tar -cf graphengine_lib.tar fwkacllib acllib atc
  293. fi
  294. }
  295. if [[ "X$ENABLE_GE_UT" = "Xoff" && "X$MINDSPORE_MODE" = "Xoff" ]]; then
  296. generate_package
  297. elif [ "X$MINDSPORE_MODE" = "Xon" ]
  298. then
  299. cd "${OUTPUT_PATH}"
  300. find ./ -name graphengine_lib.tar -exec rm {} \;
  301. tar -cf graphengine_lib.tar lib
  302. fi
  303. echo "---------------- GraphEngine package archive generated ----------------"

图引擎模块(GE)是MindSpore的一个子模块,其代码由C++实现,位于前端模块ME和底层硬件之间,起到承接作用。图引擎模块以ME下发的图作为输入,然后进行一系列的深度图优化操作,最后输出一张可以在底层硬件上高效运行的图。GE针对昇腾AI处理器的硬件结构特点,做了特定的优化工作,以此来充分发挥出昇腾AI处理器的强大算力。在进行模型训练/推理时,GE会被自动调用而用户并不感知。GE主要由GE API和GE Core两部分组成,详细的架构图如下所示