From 09772f2291d8afad50c8d3f3ffe7e2bc62e08c68 Mon Sep 17 00:00:00 2001 From: liuqi Date: Wed, 31 Jan 2018 16:51:28 +0800 Subject: [PATCH] Support run on local PC. --- local_validate_model.sh | 131 ++++++++++++++++++++++++++++++++++++++++ validate.py | 3 +- validate_model.sh | 6 ++ 3 files changed, 139 insertions(+), 1 deletion(-) create mode 100755 local_validate_model.sh diff --git a/local_validate_model.sh b/local_validate_model.sh new file mode 100755 index 00000000..1c2eeb1a --- /dev/null +++ b/local_validate_model.sh @@ -0,0 +1,131 @@ +#!/bin/bash +# Must run at root dir of mace project. +set +x +Usage() { + echo 'Usage: bash tools/validate_model.sh tools/model.config' +} + +if [ $# -lt 1 ];then + Usage + exit -1 +fi + +source $1 + +LIB_FOLDER_NAME="libmace_v7" + +if [ x"$RUNTIME" = x"cpu" ]; then + DATA_TYPE="DT_FLOAT" + DEVICE_TYPE="CPU" +else + Usage + exit -1 +fi + +LIBMACE_TAG=`git describe --abbrev=0 --tags` || exit -1 + +VLOG_LEVEL=0 +MODEL_DIR=$(dirname ${TF_MODEL_FILE_PATH}) +LIBMACE_SOURCE_DIR=`/bin/pwd` +LIBMACE_BUILD_DIR="${LIBMACE_SOURCE_DIR}/build" +INPUT_FILE_NAME="model_input" +OUTPUT_FILE_NAME="model.out" +OUTPUT_LIST_FILE="model.list" +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 + + round=1 + + bazel build --verbose_failures -c opt --strip always examples:mace_run \ + --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 || exit -1 + + MACE_CPP_MIN_VLOG_LEVEL=$VLOG_LEVEL \ + bazel-bin/examples/mace_run \ + --input_shape="${INPUT_SHAPE}"\ + --output_shape="${OUTPUT_SHAPE}"\ + --input_file=${MODEL_DIR}/${INPUT_FILE_NAME} \ + --output_file=${MODEL_DIR}/${OUTPUT_FILE_NAME} \ + --device=${DEVICE_TYPE} \ + --round=$round || exit -1 +} + +download_and_link_lib() +{ + 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 + + echo "Create link 'mace' of downloaded or existed ${LIB_FOLDER_NAME}" + if [ -L ${LIBMACE_SOURCE_DIR}/lib/mace ]; then + 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 +} + +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} \ + --input_shape="${INPUT_SHAPE}" || exit -1 + +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} +#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} \ +# --input_shape="${INPUT_SHAPE}" \ +# --obfuscate=False || exit -1 + +echo "Step 3: Download mace static library" +download_and_link_lib + +echo "Step 4: remove the mace run result." +rm -rf ${MODEL_DIR}/${OUTPUT_FILE_NAME} + +echo "Step 7: Run model on the phone using binary" +build_and_run true + +echo "Step 9: Validate the result" +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} \ + --mace_runtime ${RUNTIME} \ + --input_node ${TF_INPUT_NODE} \ + --output_node ${TF_OUTPUT_NODE} \ + --input_shape ${INPUT_SHAPE} \ + --output_shape ${OUTPUT_SHAPE} + +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} + +echo "Done" diff --git a/validate.py b/validate.py index a9767185..5c66efe3 100644 --- a/validate.py +++ b/validate.py @@ -43,7 +43,8 @@ def valid_output(out_shape, mace_out_file, tf_out_value): if mace_out_value.size != 0: similarity = (1 - spatial.distance.cosine(tf_out_value.flat, mace_out_value)) print 'MACE VS TF similarity: ', similarity - if (FLAGS.mace_runtime == "gpu" and similarity > 0.995) or \ + if (FLAGS.mace_runtime == "cpu" and similarity > 0.999) or \ + (FLAGS.mace_runtime == "gpu" and similarity > 0.995) or \ (FLAGS.mace_runtime == "dsp" and similarity > 0.930): print '=======================Similarity Test Passed======================' else: diff --git a/validate_model.sh b/validate_model.sh index 1cfa30d1..ee3a4e97 100755 --- a/validate_model.sh +++ b/validate_model.sh @@ -29,6 +29,9 @@ if [ x"$RUNTIME" = x"dsp" ]; then elif [ x"$RUNTIME" = x"gpu" ]; then DATA_TYPE="DT_HALF" DEVICE_TYPE="OPENCL" +elif [ x"$RUNTIME" = x"cpu" ]; then + DATA_TYPE="DT_FLOAT" + DEVICE_TYPE="CPU" else Usage exit -1 @@ -62,6 +65,9 @@ build_and_run() if [[ "${TUNING_OR_NOT}" != "0" && "$PRODUCTION_MODE" != true ]];then tuning_flag=1 round=0 # only warm up + elif [[ "$PRODUCTION_MODE" != true ]];then + tuning_flag=0 + round=1 else tuning_flag=0 round=2 -- GitLab