build_npu.sh 5.1 KB
Newer Older
1 2 3
#!/bin/bash
set -ex

4 5 6 7
# global variables with default value
ARM_OS="android"                    # android only yet
ARM_ABI="armv8"                     # armv8, armv7
ARM_LANG="gcc"                      # gcc only yet
8 9
ANDROID_STL="c++_shared"            # c++_shared/c++_static, c++_shared is used by HiAI DDK 310
DDK_ROOT="$(pwd)/ai_ddk_lib/"       # HiAI DDK 310 from https://developer.huawei.com/consumer/cn/hiai/
10
TARGET_NAME="test_subgraph_pass"    # default target
11 12 13
BUILD_EXTRA=OFF                     # ON(with sequence ops)/OFF
WITH_JAVA=ON                        # ON(build jar and jni so)/OFF
WITH_TESTING=ON                     # ON/OFF
14
WITH_LOG=ON                         # ON(disable logging)/OFF
15 16
ON_TINY_PUBLISH=OFF                 # ON(tiny publish)/OFF(full publish)

17 18 19 20 21 22
function print_usage {
    echo -e "\nUSAGE:"
    echo
    echo "----------------------------------------"
    echo -e "--arm_os=<os> android only yet."
    echo -e "--arm_abi=<abi> armv8, armv7 yet."
23 24 25 26
    echo -e "--android_stl=<shared> c++_shared or c++_static"
    echo -e "--arm_lang=<gcc>"
    echo -e "--ddk_root=<hiai_ddk_root>"
    echo -e "--target_name=<target_name>"
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
    echo "----------------------------------------"
    echo
}

# for code gen, a source file is generated after a test, 
# but is dependended by some targets in cmake.
# here we fake an empty file to make cmake works.
function prepare_workspace {
    # in build directory
    # 1. Prepare gen_code file
    GEN_CODE_PATH_PREFIX=lite/gen_code
    mkdir -p ./${GEN_CODE_PATH_PREFIX}
    touch ./${GEN_CODE_PATH_PREFIX}/__generated_code__.cc

    # 2.Prepare debug tool
    DEBUG_TOOL_PATH_PREFIX=lite/tools/debug
    mkdir -p ./${DEBUG_TOOL_PATH_PREFIX}
    cp ../${DEBUG_TOOL_PATH_PREFIX}/analysis_tool.py ./${DEBUG_TOOL_PATH_PREFIX}/
}

function prepare_thirdparty {
    readonly THIRDPARTY_TAR=https://paddle-inference-dist.bj.bcebos.com/PaddleLite/third-party-05b862.tar.gz

    readonly workspace=$PWD
    if [ ! -d $workspace/third-party -o -f $workspace/third-party-05b862.tar.gz ]; then
        rm -rf $workspace/third-party

         if [ ! -f $workspace/third-party-05b862.tar.gz ]; then
            wget $THIRDPARTY_TAR
        fi
        tar xzf third-party-05b862.tar.gz
    else
        git submodule update --init --recursive
    fi
}

63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
function build_npu {
    cur_dir=$(pwd)

    prepare_thirdparty

    local stl_dir
    local publish_dir
    # the c++ symbol is not recognized by the bundled script
    if [[ "${ANDROID_STL}" == "c++_shared" ]]; then
        stl_dir="cxx_shared"
    fi
    if [[ "${ANDROID_STL}" == "c++_static" ]]; then
        stl_dir="cxx_static"
    fi
    if [[ "${ON_TINY_PUBLISH}" == "ON" ]]; then
        WITH_TESTING=OFF
79
        WITH_LOG=OFF
80 81 82 83 84 85 86
        publish_dir="tiny_publish"
    else
        publish_dir="full_publish"
    fi
    build_dir=$cur_dir/build.lite.npu.${ARM_OS}.${ARM_ABI}.${ARM_LANG}.${stl_dir}.${publish_dir}
    mkdir -p $build_dir
    cd $build_dir
87 88

    # NPU libs need API LEVEL 24 above
89
    prepare_workspace
90 91 92 93 94 95
    cmake .. \
        -DWITH_GPU=OFF \
        -DWITH_MKL=OFF \
        -DWITH_LITE=ON \
        -DLITE_WITH_CUDA=OFF \
        -DLITE_WITH_X86=OFF \
96
        -DLITE_BUILD_EXTRA=${BUILD_EXTRA} \
97 98 99
        -DLITE_WITH_ARM=ON \
        -DWITH_ARM_DOTPROD=ON   \
        -DLITE_WITH_LIGHT_WEIGHT_FRAMEWORK=ON \
100 101
        -DWITH_TESTING=${WITH_TESTING} \
        -DLITE_WITH_JAVA=${WITH_JAVA} \
102
        -DLITE_WITH_LOG=${WITH_LOG} \
103
        -DLITE_WITH_NPU=ON \
104
        -DLITE_ON_TINY_PUBLISH=${ON_TINY_PUBLISH} \
105
        -DANDROID_API_LEVEL=24 \
106 107 108 109 110
        -DARM_TARGET_OS=${ARM_OS} \
        -DARM_TARGET_ARCH_ABI=${ARM_ABI} \
        -DARM_TARGET_LANG=${ARM_LANG} \
        -DANDROID_STL_TYPE=${ANDROID_STL} \
        -DNPU_DDK_ROOT=${DDK_ROOT}
111

112
    make $TARGET_NAME -j2
113 114 115 116 117 118 119 120 121

    cd -
    echo "Done"
}

function main {
    # Parse command line.
    for i in "$@"; do
        case $i in
122 123
            --target_name=*)
                TARGET_NAME="${i#*=}"
124 125 126 127 128 129 130 131 132 133 134 135 136 137
                shift
                ;;
            --arm_os=*)
                ARM_OS="${i#*=}"
                shift
                ;;
            --arm_abi=*)
                ARM_ABI="${i#*=}"
                shift
                ;;
            --arm_lang=*)
                ARM_LANG="${i#*=}"
                shift
                ;;
138 139 140 141
            --android_stl=*)
                ANDROID_STL="${i#*=}"
                shift
                ;;
142 143 144 145
            --build_extra=*)
                BUILD_EXTRA="${i#*=}"
                shift
                ;;
146 147 148 149
            --ddk_root=*)
                DDK_ROOT="${i#*=}"
                shift
                ;;
150
            build)
151
                build_npu
152 153 154
                shift
                ;;
            full_publish)
155 156 157 158 159 160 161 162
                TARGET_NAME=publish_inference
                build_npu
                shift
                ;;
            tiny_publish)
                ON_TINY_PUBLISH=ON
                TARGET_NAME=publish_inference
                build_npu
163 164 165 166 167 168 169 170 171 172 173 174
                shift
                ;;
            *)
                # unknown option
                print_usage
                exit 1
                ;;
        esac
    done
}

main $@