diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8a954bd4ebc67c47a1c54cea70dd94210a0f3f25..48921247440a7b6679da1c93577f0f44832d652f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -56,7 +56,34 @@ cmake_build_android-arm64-v8: bazel_build: stage: build script: - - sh tools/bazel-build-standalone-lib.sh + - bash tools/bazel_build_standalone_lib.sh + - bash tools/bazel_build_standalone_lib.sh --abi=armeabi-v7a --runtimes=cpu + - bash tools/bazel_build_standalone_lib.sh --abi=armeabi-v7a --runtimes=cpu,gpu + - bash tools/bazel_build_standalone_lib.sh --abi=armeabi-v7a --runtimes=cpu,gpu,dsp + - bash tools/bazel_build_standalone_lib.sh --abi=armeabi-v7a --runtimes=cpu,gpu,apu + - bash tools/bazel_build_standalone_lib.sh --abi=arm64-v8a --runtimes=cpu + - bash tools/bazel_build_standalone_lib.sh --abi=arm64-v8a --runtimes=cpu,gpu + - bash tools/bazel_build_standalone_lib.sh --abi=arm64-v8a --runtimes=cpu,gpu,dsp + - bash tools/bazel_build_standalone_lib.sh --abi=arm64-v8a --runtimes=cpu,gpu,apu + - bash tools/bazel_build_standalone_lib.sh --abi=arm_linux_gnueabihf --runtimes=cpu + - bash tools/bazel_build_standalone_lib.sh --abi=arm_linux_gnueabihf --runtimes=cpu,gpu + - bash tools/bazel_build_standalone_lib.sh --abi=aarch64_linux_gnu --runtimes=cpu + - bash tools/bazel_build_standalone_lib.sh --abi=aarch64_linux_gnu --runtimes=cpu,gpu + - bash tools/bazel_build_standalone_lib.sh --abi=host + - bash tools/bazel_build_standalone_lib.sh --static + - bash tools/bazel_build_standalone_lib.sh --abi=armeabi-v7a --runtimes=cpu --static + - bash tools/bazel_build_standalone_lib.sh --abi=armeabi-v7a --runtimes=cpu,gpu --static + - bash tools/bazel_build_standalone_lib.sh --abi=armeabi-v7a --runtimes=cpu,gpu,dsp --static + - bash tools/bazel_build_standalone_lib.sh --abi=armeabi-v7a --runtimes=cpu,gpu,apu --static + - bash tools/bazel_build_standalone_lib.sh --abi=arm64-v8a --runtimes=cpu --static + - bash tools/bazel_build_standalone_lib.sh --abi=arm64-v8a --runtimes=cpu,gpu --static + - bash tools/bazel_build_standalone_lib.sh --abi=arm64-v8a --runtimes=cpu,gpu,dsp --static + - bash tools/bazel_build_standalone_lib.sh --abi=arm64-v8a --runtimes=cpu,gpu,apu --static + - bash tools/bazel_build_standalone_lib.sh --abi=arm_linux_gnueabihf --runtimes=cpu --static + - bash tools/bazel_build_standalone_lib.sh --abi=arm_linux_gnueabihf --runtimes=cpu,gpu --static + - bash tools/bazel_build_standalone_lib.sh --abi=aarch64_linux_gnu --runtimes=cpu --static + - bash tools/bazel_build_standalone_lib.sh --abi=aarch64_linux_gnu --runtimes=cpu,gpu --static + - bash tools/bazel_build_standalone_lib.sh --abi=host --static only: - triggers diff --git a/docs/user_guide/basic_usage.rst b/docs/user_guide/basic_usage.rst index 5aaaf4fd860c4e266855ca09ea7b7cb742776187..57c888fb07a7cc9fd5bd20b43a370a93323f748d 100644 --- a/docs/user_guide/basic_usage.rst +++ b/docs/user_guide/basic_usage.rst @@ -5,7 +5,7 @@ Basic usage for Bazel users Build and run an example model ------------------------------- -At first, make sure the environment has been set up correctly already (refer to :doc:`../installation/env_requirement`). +At first, make sure the environment has been set up correctly already (refer to :doc:`../installation/env_requirement.rst`). The followings are instructions about how to quickly build and run a provided model in `MACE Model Zoo `__. @@ -45,16 +45,16 @@ Here we use the mobilenet-v2 model as an example. cd path/to/mace # Build library # output lib path: build/lib - bash tools/bazel-build-standalone-lib.sh - + bash tools/bazel_build_standalone_lib.sh [-abi=abi][-runtimes=rt1,rt2,...][-static] .. note:: - This step can be skipped if you just want to run a model using ``tools/converter.py``, such as commands in step 5. - - - Libraries in ``build/lib/armeabi-v7a/cpu_gpu/`` means it can run on ``cpu`` or ``gpu`` devices. - - - The results in ``build/lib/armeabi-v7a/cpu_gpu_dsp/`` need HVX supported. + - Use the `-abi` parameter to specify the ABI. Supported ABIs are armeabi-v7a, arm64-v8a, arm_linux_gnueabihf, aarch64_linux_gnu and host (for host machine, linux-x86-64). The default ABI is arm64-v8a. + - For each ABI, several runtimes can be chosen by specifying the `-runtimes` parameter. Supported runtimes are CPU, GPU, DSP and APU. By default, the library is built to run on CPU. + - Omit the `-static` option if a shared library is desired instead of a static one. By default, a shared library is built. + - See 'bash tools/bazel_build_standalone_lib.sh -help' for detailed information. + - DO respect the hyphens ('-') and the underscores ('_') in the ABI. 4. Convert the pre-trained mobilenet-v2 model to MACE format model. @@ -189,14 +189,13 @@ Or use bazel to build MACE source code into a library. cd path/to/mace # Build library # output lib path: build/lib - bash tools/bazel-build-standalone-lib.sh + bash tools/bazel_build_standalone_lib.sh [-abi=abi][-runtimes=rt1,rt2,...][-static] -The above command will generate dynamic library ``build/lib/${ABI}/${DEVICES}/libmace.so`` and static library ``build/lib/${ABI}/${DEVICES}/libmace.a``. +The above command will generate static library ``build/lib/libmace.a`` dynamic library ``build/lib/libmace.so``. .. warning:: - Please verify that the target_abis param in the above command and your deployment file are the same. - + Please verify that the -abi param in the above command is the same as the target_abi param in your deployment file. ================== 5. Run your model @@ -284,21 +283,9 @@ header files. │   └── public │   └── mace.h ├── lib - │   ├── arm64-v8a - │   │ └── cpu_gpu - │   │   ├── libmace.a - │   │   └── libmace.so - │   ├── armeabi-v7a - │   │ ├── cpu_gpu - │   │   │ ├── libmace.a - │   │   │ └── libmace.so - │   │ └── cpu_gpu_dsp - │   │   ├── libhexagon_controller.so - │   │   ├── libmace.a - │   │   └── libmace.so - │   └── linux-x86-64 - │   ├── libmace.a - │   └── libmace.so + │ ├── libmace.a (for static library) + │ ├── libmace.so (for shared library) + │   └── libhexagon_controller.so (for DSP runtime) └── mobilenet-v1 ├── model │   ├── mobilenet_v1.data @@ -387,3 +374,4 @@ Please refer to \ ``mace/tools/mace_run.cc``\ for full usage. The following list MaceStatus status = engine.Run(inputs, &outputs); More details are in :doc:`advanced_usage`. + diff --git a/tools/bazel-build-standalone-lib.sh b/tools/bazel-build-standalone-lib.sh deleted file mode 100755 index f01dd06510d19f747f44303a5f949276962ba0a1..0000000000000000000000000000000000000000 --- a/tools/bazel-build-standalone-lib.sh +++ /dev/null @@ -1,141 +0,0 @@ -#!/bin/bash - -set -e - -LIB_DIR=build/lib -INCLUDE_DIR=build/include - -mkdir -p $LIB_DIR -mkdir -p $INCLUDE_DIR - -# copy include headers -cp -R include/mace $INCLUDE_DIR/ - -# make directories -rm -rf $LIB_DIR/armeabi-v7a -mkdir -p $LIB_DIR/armeabi-v7a/cpu_gpu_dsp -mkdir -p $LIB_DIR/armeabi-v7a/cpu_gpu - -rm -rf $LIB_DIR/arm64-v8a -mkdir -p $LIB_DIR/arm64-v8a/cpu_gpu_dsp -mkdir -p $LIB_DIR/arm64-v8a/cpu_gpu -mkdir -p $LIB_DIR/arm64-v8a/cpu_gpu_apu - -if [[ "$BUILD_HTA" == "1" ]]; then - mkdir -p $LIB_DIR/armeabi-v7a/cpu_gpu_hta - mkdir -p $LIB_DIR/arm64-v8a/cpu_gpu_hta -fi - -rm -rf $LIB_DIR/linux-x86-64 -mkdir -p $LIB_DIR/linux-x86-64 - -rm -rf $LIB_DIR/arm_linux_gnueabihf -mkdir -p $LIB_DIR/arm_linux_gnueabihf/cpu_gpu - -rm -rf $LIB_DIR/aarch64_linux_gnu -mkdir -p $LIB_DIR/aarch64_linux_gnu/cpu_gpu - - - -# build shared libraries -if [[ "$BUILD_HTA" == "1" ]]; then - echo "build shared lib for armeabi-v7a + cpu_gpu_hta" - bazel build --config android --config optimization mace/libmace:libmace_dynamic --define neon=true --define opencl=true --define hta=true --define quantize=true --cpu=armeabi-v7a --define rpcmem=true - cp bazel-bin/mace/libmace/libmace.so $LIB_DIR/armeabi-v7a/cpu_gpu_hta/ - cp third_party/hta/armeabi-v7a/*so $LIB_DIR/armeabi-v7a/cpu_gpu_hta/ - - echo "build shared lib for arm64-v8a + cpu_gpu_hta" - bazel build --config android --config optimization mace/libmace:libmace_dynamic --define neon=true --define opencl=true --define hta=true --define quantize=true --cpu=arm64-v8a --define rpcmem=true - cp bazel-bin/mace/libmace/libmace.so $LIB_DIR/arm64-v8a/cpu_gpu_hta/ - cp third_party/hta/arm64-v8a/*so $LIB_DIR/arm64-v8a/cpu_gpu_hta/ -fi - -echo "build shared lib for armeabi-v7a + cpu_gpu_dsp" -bazel build --config android --config optimization mace/libmace:libmace_dynamic --define neon=true --define opencl=true --define hexagon=true --define quantize=true --cpu=armeabi-v7a --define rpcmem=true -cp bazel-bin/mace/libmace/libmace.so $LIB_DIR/armeabi-v7a/cpu_gpu_dsp/ -cp third_party/nnlib/armeabi-v7a/*so $LIB_DIR/armeabi-v7a/cpu_gpu_dsp/ - -echo "build shared lib for arm64-v8a + cpu_gpu_dsp" -bazel build --config android --config optimization mace/libmace:libmace_dynamic --define neon=true --define opencl=true --define hexagon=true --define quantize=true --cpu=arm64-v8a --define rpcmem=true -cp bazel-bin/mace/libmace/libmace.so $LIB_DIR/arm64-v8a/cpu_gpu_dsp/ -cp third_party/nnlib/arm64-v8a/*so $LIB_DIR/arm64-v8a/cpu_gpu_dsp/ - -echo "build shared lib for arm64-v8a + cpu_gpu_apu" -bazel build --config android --config optimization mace/libmace:libmace_dynamic --define neon=true --define openmp=false --define opencl=true --define apu=true --define quantize=true --cpu=arm64-v8a -cp bazel-bin/mace/libmace/libmace.so $LIB_DIR/arm64-v8a/cpu_gpu_apu/ -cp third_party/apu/*so $LIB_DIR/arm64-v8a/cpu_gpu_apu/ - -echo "build shared lib for armeabi-v7a + cpu_gpu" -bazel build --config android --config optimization mace/libmace:libmace_dynamic --define neon=true --define opencl=true --define quantize=true --cpu=armeabi-v7a --define rpcmem=true -cp bazel-bin/mace/libmace/libmace.so $LIB_DIR/armeabi-v7a/cpu_gpu/ - -echo "build shared lib for arm64-v8a + cpu_gpu" -bazel build --config android --config optimization mace/libmace:libmace_dynamic --define neon=true --define opencl=true --define quantize=true --cpu=arm64-v8a --define rpcmem=true -cp bazel-bin/mace/libmace/libmace.so $LIB_DIR/arm64-v8a/cpu_gpu/ - -echo "build shared lib for arm_linux_gnueabihf + cpu_gpu" -bazel build --config arm_linux_gnueabihf --config optimization mace/libmace:libmace_dynamic --define neon=true --define opencl=true --define quantize=true -cp bazel-bin/mace/libmace/libmace.so $LIB_DIR/arm_linux_gnueabihf/cpu_gpu/ - -echo "build shared lib for aarch64_linux_gnu + cpu_gpu" -bazel build --config aarch64_linux_gnu --config optimization mace/libmace:libmace_dynamic --define neon=true --define opencl=true --define quantize=true -cp bazel-bin/mace/libmace/libmace.so $LIB_DIR/aarch64_linux_gnu/cpu_gpu/ - -if [[ "$OSTYPE" != "darwin"* ]];then - echo "build shared lib for linux-x86-64" - bazel build mace/libmace:libmace_dynamic --config linux --config optimization - cp bazel-bin/mace/libmace/libmace.so $LIB_DIR/linux-x86-64/ -fi - -# build static libraries -if [[ "$BUILD_HTA" == "1" ]]; then - echo "build static lib for armeabi-v7a + cpu_gpu_hta" - bazel build --config android --config optimization mace/libmace:libmace_static --config symbol_hidden --define neon=true --define opencl=true --define hta=true --define quantize=true --cpu=armeabi-v7a --define rpcmem=true - cp bazel-genfiles/mace/libmace/libmace.a $LIB_DIR/armeabi-v7a/cpu_gpu_hta/ - cp third_party/hta/armeabi-v7a/*so $LIB_DIR/armeabi-v7a/cpu_gpu_hta/ - - echo "build static lib for arm64-v8a + cpu_gpu_hta" - bazel build --config android --config optimization mace/libmace:libmace_static --config symbol_hidden --define neon=true --define opencl=true --define hta=true --define quantize=true --cpu=arm64-v8a --define rpcmem=true - cp bazel-genfiles/mace/libmace/libmace.a $LIB_DIR/arm64-v8a/cpu_gpu_hta/ - cp third_party/hta/arm64-v8a/*so $LIB_DIR/arm64-v8a/cpu_gpu_hta/ -fi - -echo "build static lib for armeabi-v7a + cpu_gpu_dsp" -bazel build --config android --config optimization mace/libmace:libmace_static --config symbol_hidden --define neon=true --define opencl=true --define hexagon=true --define quantize=true --cpu=armeabi-v7a --define rpcmem=true -cp bazel-genfiles/mace/libmace/libmace.a $LIB_DIR/armeabi-v7a/cpu_gpu_dsp/ -cp third_party/nnlib/armeabi-v7a/*so $LIB_DIR/armeabi-v7a/cpu_gpu_dsp/ - -echo "build static lib for arm64-v8a + cpu_gpu_dsp" -bazel build --config android --config optimization mace/libmace:libmace_static --config symbol_hidden --define neon=true --define opencl=true --define hexagon=true --define quantize=true --cpu=arm64-v8a --define rpcmem=true -cp bazel-genfiles/mace/libmace/libmace.a $LIB_DIR/arm64-v8a/cpu_gpu_dsp/ -cp third_party/nnlib/arm64-v8a/*so $LIB_DIR/arm64-v8a/cpu_gpu_dsp/ - -echo "build static lib for arm64-v8a + cpu_gpu_apu" -bazel build --config android --config optimization mace/libmace:libmace_static --config symbol_hidden --define neon=true --define openmp=false --define opencl=true --define apu=true --define quantize=true --cpu=arm64-v8a -cp bazel-genfiles/mace/libmace/libmace.a $LIB_DIR/arm64-v8a/cpu_gpu_apu/ -cp third_party/apu/*so $LIB_DIR/arm64-v8a/cpu_gpu_apu/ - -echo "build static lib for armeabi-v7a + cpu_gpu" -bazel build --config android --config optimization mace/libmace:libmace_static --config symbol_hidden --define neon=true --define opencl=true --define quantize=true --cpu=armeabi-v7a --define rpcmem=true -cp bazel-genfiles/mace/libmace/libmace.a $LIB_DIR/armeabi-v7a/cpu_gpu/ - -echo "build static lib for arm64-v8a + cpu_gpu" -bazel build --config android --config optimization mace/libmace:libmace_static --config symbol_hidden --define neon=true --define opencl=true --define quantize=true --cpu=arm64-v8a --define rpcmem=true -cp bazel-genfiles/mace/libmace/libmace.a $LIB_DIR/arm64-v8a/cpu_gpu/ - -echo "build static lib for arm_linux_gnueabihf + cpu_gpu" -bazel build --config arm_linux_gnueabihf --config optimization mace/libmace:libmace_static --config symbol_hidden --define neon=true --define opencl=true --define quantize=true -cp bazel-genfiles/mace/libmace/libmace.a $LIB_DIR/arm_linux_gnueabihf/cpu_gpu/ - -echo "build static lib for aarch64_linux_gnu + cpu_gpu" -bazel build --config aarch64_linux_gnu --config optimization mace/libmace:libmace_static --config symbol_hidden --define neon=true --define opencl=true --define quantize=true -cp bazel-genfiles/mace/libmace/libmace.a $LIB_DIR/aarch64_linux_gnu/cpu_gpu/ - -if [[ "$OSTYPE" != "darwin"* ]];then - echo "build static lib for linux-x86-64" - bazel build mace/libmace:libmace_static --config linux --config optimization - cp bazel-genfiles/mace/libmace/libmace.a $LIB_DIR/linux-x86-64/ -fi - -echo "LIB PATH: $LIB_DIR" -echo "INCLUDE FILE PATH: $INCLUDE_DIR" diff --git a/tools/bazel_build_standalone_lib.sh b/tools/bazel_build_standalone_lib.sh new file mode 100755 index 0000000000000000000000000000000000000000..6e92af248a69e66fe82c255d7014412db5c47456 --- /dev/null +++ b/tools/bazel_build_standalone_lib.sh @@ -0,0 +1,171 @@ +#!/bin/bash +# Copyright 2020 The MACE Authors. All Rights Reserved. + +set -e + +LIB_DIR=build/lib +INCLUDE_DIR=build/include + +# colors for terminal display +declare -r RED='\033[0;31m' +declare -r NC='\033[0m' # No Color +declare -r BOLD=$(tput bold) +declare -r NORMAL=$(tput sgr0) + +# helper function +helper() { + echo -e "usage:\t$0 ["${BOLD}"--abi"${NORMAL}"=abi]\ +["${BOLD}"--runtimes"${NORMAL}"=rt1,rt2,...]["${BOLD}"--static"${NORMAL}"]" + + echo -e "\t"${BOLD}"--abi:"${NORMAL}" specifies the targeted ABI, supported \ +ABIs are:\n\t\tarmeabi-v7a, arm64-v8a, arm_linux_gnueabihf, aarch64_linux_gnu \ +or \n\t\thost if the library is built for the host machine (linux-x86-64).\n\t\ +\tThe default ABI is arm64-v8a." + + echo -e "\t"${BOLD}"--runtimes:"${NORMAL}" specifies the runtimes, supported \ +runtimes are:\n\t\tcpu, gpu, dsp, apu, hta. By default, the library is built to\ + run on CPU." + + echo -e "\t"${BOLD}"--static:"${NORMAL}" option to generate the corresponding\ + static library.\n\t\tIf the option is omitted, a shared library is built." + + exit 0 +} + +# configuration variables +abi=arm64-v8a +enable_neon=true +enable_hta=false +enable_cpu=true +enable_gpu=false +enable_dsp=false +enable_apu=false +enable_quantize=true +enable_rpcmem=true +static_lib=false +symbol_hidden= +runtime_label="cpu" +lib_type=dynamic +lib_label=shared +lib_suffix=.so +bazel_dir=bazel-bin + +# make lib and include directories +mkdir -p "${LIB_DIR}" +mkdir -p "${INCLUDE_DIR}" + +# copy include headers +cp -R include/mace ${INCLUDE_DIR}/ + +# positional parameters parsing +for opt in "${@}";do + case "${opt}" in + abi=*|-abi=*|--abi=*) + abi="$(echo "${opt}" | cut -d '=' -f 2-)" + ;; + runtime=*|runtimes=*|-runtime=*|-runtimes=*|--runtime=*|--runtimes=*) + arg="$(echo "$opt" | cut -d '=' -f 2-)" + for runtime in $(echo $arg | sed s/,/\ /g);do + case $runtime in + cpu|CPU) + ;; + gpu|GPU) + enable_gpu=true + runtime_label=""${runtime_label}" gpu" + ;; + dsp|DSP) + enable_dsp=true + runtime_label=""${runtime_label}" dsp" + ;; + apu|APU) + enable_apu=true + runtime_label=""${runtime_label}" apu" + ;; + hta|HTA) + enable_hta=true + runtime_label=""${runtime_label}" hta" + ;; + *) + echo -e ""${RED}""${BOLD}"ERROR:"${NORMAL}""${NC}" unknown device \ +"${device}"" + exit 1 + ;; + esac + done + ;; + static|-static|--static) + static_lib=true + ;; + help|-help|--help) + helper + ;; + *) + echo -e ""${RED}""${BOLD}"ERROR:"${NORMAL}""${NC}" unknown parameter \ +$(echo "$1" | cut -d '=' -f -1)" + echo -e "See \x27$0 --help\x27 for more information" + exit 1 + ;; + esac +done + +if [[ "${enable_apu}" == true ]];then + enable_rpcmem=false +fi + +if [[ "${static_lib}" == true ]];then + lib_type=static + lib_label=static + lib_suffix=.a + symbol_hidden="--config symbol_hidden" + bazel_dir=bazel-genfiles +fi + +if [[ "${abi}" == host || "${abi}" == HOST ]];then + abi=linux-x86-64 +fi + +# make the directory +rm -rf "${LIB_DIR}"/"${abi}" +mkdir "${LIB_DIR}"/"${abi}" +# build the target library +build_msg="build "${lib_label}" lib for "${abi}"" +if [[ "${abi}" != linux-x86-64 ]];then + build_msg=""${build_msg}" + "${runtime_label}"" +fi +echo "-------------${build_msg}------------" +case "${abi}" in + arm_linux_gnueabihf|aarch64_linux_gnu) + bazel build --config "${abi}" \ + --config optimization mace/libmace:libmace_"${lib_type}"\ + --define neon="${enable_neon}" \ + --define opencl="${enable_gpu}" \ + --define quantize="${enable_quantize}" + ;; + linux-x86-64) + bazel build mace/libmace:libmace_"${lib_type}" --config linux --config \ + optimization + cp "${bazel_dir}"/mace/libmace/libmace"${lib_suffix}" "${LIB_DIR}"/"${abi}"/ + ;; + *) + bazel build --config android --config optimization \ + mace/libmace:libmace_"${lib_type}" ${symbol_hidden} \ + --define neon="${enable_neon}" --define hta="${enable_hta}" \ + --define opencl="${enable_gpu}" --define apu="${enable_apu}" \ + --define hexagon="${enable_dsp}" --define quantize="${enable_quantize}" \ + --cpu="${abi}" --define rpcmem="${enable_rpcmem}" + if [[ "${enable_dsp}" == true ]];then + cp third_party/nnlib/"${abi}"/libhexagon_controller.so \ + "${LIB_DIR}"/"${abi}"/ + fi + if [[ "${enable_apu}" == true ]];then + cp third_party/apu/*so "${LIB_DIR}"/"${abi}"/ + fi + if [[ "${enable_hta}" == true ]];then + cp third_party/hta/"${abi}"/*so "${LIB_DIR}"/"${abi}"/ + fi + ;; +esac +cp "${bazel_dir}"/mace/libmace/libmace"${lib_suffix}" "${LIB_DIR}"/"${abi}"/ + +echo "LIB PATH: ${LIB_DIR}" +echo "INCLUDE FILE PATH: ${INCLUDE_DIR}"