validate_model.sh 6.9 KB
Newer Older
Y
yejianwu 已提交
1 2 3 4
#!/bin/bash
# Must run at root dir of mace project.
set +x
Usage() {
5
  echo 'Usage: bash tools/validate_model.sh tools/model.config'
Y
yejianwu 已提交
6 7
}

8
if [ $# -lt 1 ];then
Y
yejianwu 已提交
9 10 11 12 13 14
  Usage
  exit -1
fi

source $1

15 16 17 18 19 20 21 22 23 24
LIB_FOLDER_NAME="libmace"
if [ x"${ANDROID_ABI}" = x"armeabi-v7a" ]; then
  LIB_FOLDER_NAME="${LIB_FOLDER_NAME}_v7"
elif [ x"${ANDROID_ABI}" = x"arm64-v8a" ]; then
  LIB_FOLDER_NAME="${LIB_FOLDER_NAME}_v8"
else
  echo "Unsopported android abi"
  exit -1
fi

Y
yejianwu 已提交
25 26 27
if [ x"$RUNTIME" = x"dsp" ]; then
  DATA_TYPE="DT_UINT8"
  DEVICE_TYPE="HEXAGON"
28
  LIB_FOLDER_NAME="${LIB_FOLDER_NAME}_dsp"
L
Liangliang He 已提交
29
elif [ x"$RUNTIME" = x"gpu" ]; then
Y
yejianwu 已提交
30 31
  DATA_TYPE="DT_HALF"
  DEVICE_TYPE="OPENCL"
L
liuqi 已提交
32 33 34
elif [ x"$RUNTIME" = x"cpu" ]; then
  DATA_TYPE="DT_FLOAT"
  DEVICE_TYPE="CPU"
L
Liangliang He 已提交
35 36 37
else
  Usage
  exit -1
Y
yejianwu 已提交
38 39
fi

40
LIBMACE_TAG=`git describe --abbrev=0 --tags` || exit -1
41

Y
yejianwu 已提交
42 43 44
VLOG_LEVEL=0
MODEL_DIR=$(dirname ${TF_MODEL_FILE_PATH})
LIBMACE_SOURCE_DIR=`/bin/pwd`
45 46 47 48
LIBMACE_BUILD_DIR="${LIBMACE_SOURCE_DIR}/build"
INPUT_FILE_NAME="model_input"
OUTPUT_FILE_NAME="model.out"
OUTPUT_LIST_FILE="model.list"
Y
yejianwu 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
PHONE_DATA_DIR="/data/local/tmp/mace_run"
KERNEL_DIR="${PHONE_DATA_DIR}/cl/"
CODEGEN_DIR=${LIBMACE_SOURCE_DIR}/codegen
MODEL_CODEGEN_DIR=${CODEGEN_DIR}/models/${MODEL_TAG}
CL_CODEGEN_DIR=${CODEGEN_DIR}/opencl
CL_BIN_DIR=${CODEGEN_DIR}/opencl_bin
TUNING_CODEGEN_DIR=${CODEGEN_DIR}/tuning
VERSION_SOURCE_PATH=${CODEGEN_DIR}/version

build_and_run()
{
  PRODUCTION_MODE=$1
  if [ "$PRODUCTION_MODE" = true ]; then
    PRODUCTION_MODE_BUILD_FLAGS="--define production=true"
  fi

  if [[ "${TUNING_OR_NOT}" != "0" && "$PRODUCTION_MODE" != true ]];then
    tuning_flag=1
    round=0 # only warm up
L
liuqi 已提交
68 69 70
  elif [[ "$PRODUCTION_MODE" != true ]];then
    tuning_flag=0
    round=1
Y
yejianwu 已提交
71 72 73 74 75 76 77 78
  else
    tuning_flag=0
    round=2
  fi

  bazel build --verbose_failures -c opt --strip always examples:mace_run \
    --crosstool_top=//external:android/crosstool \
    --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
79
    --cpu=${ANDROID_ABI} \
Y
yejianwu 已提交
80 81 82 83 84
    --copt="-std=c++11" \
    --copt="-D_GLIBCXX_USE_C99_MATH_TR1" \
    --copt="-Werror=return-type" \
    --copt="-DMACE_MODEL_TAG=${MODEL_TAG}" \
    $PRODUCTION_MODE_BUILD_FLAGS \
85
    --define hexagon=true || exit -1
Y
yejianwu 已提交
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

  adb shell "mkdir -p ${PHONE_DATA_DIR}" || exit -1
  if [ "$PRODUCTION_MODE" = false ]; then
    adb shell "mkdir -p ${KERNEL_DIR}" || exit -1
  fi
  adb push ${MODEL_DIR}/${INPUT_FILE_NAME} ${PHONE_DATA_DIR} || exit -1
  adb push bazel-bin/examples/mace_run ${PHONE_DATA_DIR} || exit -1
  adb push lib/hexagon/libhexagon_controller.so ${PHONE_DATA_DIR} || exit 0

  adb </dev/null shell \
    LD_LIBRARY_PATH=${PHONE_DATA_DIR} \
    MACE_TUNING=${tuning_flag} \
    MACE_CPP_MIN_VLOG_LEVEL=$VLOG_LEVEL \
    MACE_RUN_PARAMETER_PATH=${PHONE_DATA_DIR}/mace_run.config \
    MACE_KERNEL_PATH=$KERNEL_DIR \
101
    MACE_LIMIT_OPENCL_KERNEL_TIME=${LIMIT_OPENCL_KERNEL_TIME} \
Y
yejianwu 已提交
102
    ${PHONE_DATA_DIR}/mace_run \
103 104
    --input_shape="${INPUT_SHAPE}"\
    --output_shape="${OUTPUT_SHAPE}"\
Y
yejianwu 已提交
105 106 107 108 109 110
    --input_file=${PHONE_DATA_DIR}/${INPUT_FILE_NAME} \
    --output_file=${PHONE_DATA_DIR}/${OUTPUT_FILE_NAME} \
    --device=${DEVICE_TYPE}   \
    --round=$round || exit -1
}

111
download_and_link_lib()
112 113 114 115 116 117 118 119
{
  if [ ! -d "${LIBMACE_SOURCE_DIR}/lib/${LIB_FOLDER_NAME}" ]; then
    wget -P ${LIBMACE_SOURCE_DIR}/lib http://cnbj1-inner-fds.api.xiaomi.net/libmace/libs/${LIBMACE_TAG}/${LIB_FOLDER_NAME}.tar.gz && \
      tar xvzf ${LIBMACE_SOURCE_DIR}/lib/${LIB_FOLDER_NAME}.tar.gz -C ${LIBMACE_SOURCE_DIR}/lib/ || exit -1
    echo "${LIB_FOLDER_NAME} download successfully!"
  else
    echo "${LIB_FOLDER_NAME} already exists!"
  fi
120 121

  echo "Create link 'mace' of downloaded or existed ${LIB_FOLDER_NAME}"
Y
yejianwu 已提交
122
  if [ -L ${LIBMACE_SOURCE_DIR}/lib/mace ]; then
123 124 125 126
    unlink ${LIBMACE_SOURCE_DIR}/lib/mace
  fi
  ln -s ${LIBMACE_SOURCE_DIR}/lib/${LIB_FOLDER_NAME} ${LIBMACE_SOURCE_DIR}/lib/mace && \
    rm -rf ${LIBMACE_SOURCE_DIR}/lib/${LIB_FOLDER_NAME}.tar.gz || exit -1
127 128
}

Y
yejianwu 已提交
129 130 131 132
echo "Step 1: Generate input data"
rm -rf ${MODEL_DIR}/${INPUT_FILE_NAME}
python tools/validate.py --generate_data true \
 --input_file=${MODEL_DIR}/${INPUT_FILE_NAME} \
133
 --input_shape="${INPUT_SHAPE}" || exit -1
Y
yejianwu 已提交
134 135 136 137 138

echo "Step 2: Convert tf model to mace model and optimize memory"
bazel build //lib/python/tools:tf_converter || exit -1
rm -rf ${MODEL_CODEGEN_DIR}
mkdir -p ${MODEL_CODEGEN_DIR}
W
wuchenghui 已提交
139 140 141
if [ ${DSP_MODE} ]; then
    DSP_MODE_FLAG="--dsp_mode=${DSP_MODE}"
fi
Y
yejianwu 已提交
142 143 144 145 146 147 148 149 150
bazel-bin/lib/python/tools/tf_converter --input=${TF_MODEL_FILE_PATH} \
                                        --output=${MODEL_CODEGEN_DIR}/model.cc \
                                        --input_node=${TF_INPUT_NODE} \
                                        --output_node=${TF_OUTPUT_NODE} \
                                        --data_type=${DATA_TYPE} \
                                        --runtime=${RUNTIME} \
                                        --output_type=source \
                                        --template=${LIBMACE_SOURCE_DIR}/lib/python/tools/model.template \
                                        --model_tag=${MODEL_TAG} \
W
wuchenghui 已提交
151
                                        ${DSP_MODE_FLAG} \
L
liuqi 已提交
152
                                        --input_shape="${INPUT_SHAPE}" \
Y
yejianwu 已提交
153 154
                                        --obfuscate=True || exit -1

155
echo "Step 3: Download mace static library"
156
download_and_link_lib
157 158

echo "Step 4: Run model on the phone with files"
Y
yejianwu 已提交
159 160
build_and_run false

161
echo "Step 5: Generate OpenCL binary program and config code"
Y
yejianwu 已提交
162 163 164 165
rm -rf ${CL_BIN_DIR}
rm -rf ${CL_CODEGEN_DIR}
mkdir -p ${CL_BIN_DIR}
mkdir -p ${CL_CODEGEN_DIR}
166
adb pull ${KERNEL_DIR}/. ${CL_BIN_DIR}
Y
yejianwu 已提交
167 168 169
python lib/python/tools/opencl_codegen.py \
  --cl_binary_dir=${CL_BIN_DIR} --output_path=${CL_CODEGEN_DIR}/opencl_compiled_program.cc

170
echo "Step 6: Generate tuning source file"
Y
yejianwu 已提交
171 172 173 174 175 176
adb pull ${PHONE_DATA_DIR}/mace_run.config ${CL_BIN_DIR}
rm -rf ${TUNING_CODEGEN_DIR}
mkdir -p ${TUNING_CODEGEN_DIR}
python lib/python/tools/binary_codegen.py \
  --binary_file=${CL_BIN_DIR}/mace_run.config --output_path=${TUNING_CODEGEN_DIR}/tuning_params.cc

177
echo "Step 7: Run model on the phone using binary"
Y
yejianwu 已提交
178 179
build_and_run true

180
echo "Step 8: Pull the mace run result."
Y
yejianwu 已提交
181 182 183
rm -rf ${MODEL_DIR}/${OUTPUT_FILE_NAME}
adb </dev/null pull ${PHONE_DATA_DIR}/${OUTPUT_FILE_NAME} ${MODEL_DIR}

184
echo "Step 9: Validate the result"
Y
yejianwu 已提交
185 186 187
python tools/validate.py --model_file ${TF_MODEL_FILE_PATH} \
    --input_file ${MODEL_DIR}/${INPUT_FILE_NAME} \
    --mace_out_file ${MODEL_DIR}/${OUTPUT_FILE_NAME} \
188
    --mace_runtime ${RUNTIME} \
Y
yejianwu 已提交
189 190
    --input_node ${TF_INPUT_NODE} \
    --output_node ${TF_OUTPUT_NODE} \
191 192
    --input_shape ${INPUT_SHAPE} \
    --output_shape ${OUTPUT_SHAPE}
193 194 195 196 197 198 199 200 201 202

echo "Step 10: Generate project static lib"
rm -rf ${LIBMACE_BUILD_DIR}
mkdir -p ${LIBMACE_BUILD_DIR}/lib
cp -rf ${LIBMACE_SOURCE_DIR}/include ${LIBMACE_BUILD_DIR}
cp ${LIBMACE_SOURCE_DIR}/lib/hexagon/libhexagon_controller.so ${LIBMACE_BUILD_DIR}/lib
$ANDROID_NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar \
  -M < tools/libmace.mri || exit -1

echo "Done"