validate_gcn.sh 4.8 KB
Newer Older
L
liuqi 已提交
1 2
#!/bin/bash
# Must run at root dir of mace project.
Y
Yin Li 已提交
3
set +x
L
liuqi 已提交
4
Usage() {
5
  echo 'Usage: bash tools/validate_gcn.sh tools/gcn.config tf_model_path image_size [tuning]'
L
liuqi 已提交
6 7
}

8
if [ $# -lt 2 ];then
L
liuqi 已提交
9 10 11 12
  Usage
  exit -1
fi

13 14
source $1

15
VLOG_LEVEL=0
16
TF_MODEL_FILE_PATH=$2
L
liuqi 已提交
17
MODEL_DIR=$(dirname ${TF_MODEL_FILE_PATH})
18
MACE_SOURCE_DIR=`/bin/pwd`
L
liuqi 已提交
19 20 21
MACE_MODEL_NAME='mace_model.pb'
INPUT_FILE_NAME='model_input'
OUTPUT_FILE_NAME='gcn.out'
L
liuqi 已提交
22
OUTPUT_LIST_FILE='gcn.list'
L
liuqi 已提交
23 24
PHONE_DATA_DIR="/data/local/tmp/${MACE_MODEL_NAME}"
KERNEL_DIR="${PHONE_DATA_DIR}/cl/"
25
IMAGE_SIZE=$3
26
MODEL_TAG=GCN${IMAGE_SIZE}
L
Liangliang He 已提交
27 28 29 30
CODEGEN_DIR=${MACE_SOURCE_DIR}/mace/codegen
MODEL_CODEGEN_DIR=${CODEGEN_DIR}/models/gcn-$IMAGE_SIZE
CL_CODEGEN_DIR=${CODEGEN_DIR}/opencl
CL_BIN_DIR=${CODEGEN_DIR}/opencl_bin
31
TUNING_CODEGEN_DIR=${CODEGEN_DIR}/tuning
32
TUNING_OR_NOT=${4:-0}
L
liuqi 已提交
33
VERSION_SOURCE_PATH=${CODEGEN_DIR}/version
L
Liangliang He 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

build_and_run()
{
  EMBED_OPENCL_BINARY=$1
  if [ "$EMBED_OPENCL_BINARY" = true ]; then
    EMBED_OPENCL_BINARY_BUILD_FLAGS="--define embed_binary_program=true"
  fi

  bazel build -c opt --strip always mace/examples:mace_run \
    --crosstool_top=//external:android/crosstool \
    --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
    --cpu=arm64-v8a \
    $EMBED_OPENCL_BINARY_BUILD_FLAGS \
    --copt=-DMACE_MODEL_FUNCTION=Create${MODEL_TAG}

  adb shell "mkdir -p ${PHONE_DATA_DIR}"
  if [ "$EMBED_OPENCL_BINARY" = false ]; then
    adb shell "mkdir -p ${KERNEL_DIR}"
52
    adb push mace/kernels/opencl/cl/. ${KERNEL_DIR}
L
Liangliang He 已提交
53 54 55 56
  fi
  adb push ${MODEL_DIR}/${INPUT_FILE_NAME} ${PHONE_DATA_DIR}
  adb push bazel-bin/mace/examples/mace_run ${PHONE_DATA_DIR}

57 58
  if [[ "${TUNING_OR_NOT}" != "0" && "$EMBED_OPENCL_BINARY" != true ]];then
    tuning_flag=1
L
Liangliang He 已提交
59
    round=0 # only warm up
60 61
  else
    tuning_flag=0
L
Liangliang He 已提交
62
    round=2
63
  fi
L
Liangliang He 已提交
64

65
  adb </dev/null shell MACE_TUNING=${tuning_flag} \
66
    MACE_CPP_MIN_VLOG_LEVEL=$VLOG_LEVEL \
L
Liangliang He 已提交
67 68 69 70 71 72 73
    MACE_RUN_PARAMETER_PATH=${PHONE_DATA_DIR}/mace_run.config \
    MACE_KERNEL_PATH=$KERNEL_DIR \
    ${PHONE_DATA_DIR}/mace_run \
    --model=${PHONE_DATA_DIR}/${MACE_MODEL_NAME} \
    --input=mace_input_node \
    --output=mace_output_node \
    --input_shape="1,${IMAGE_SIZE},${IMAGE_SIZE},3"\
Y
yejianwu 已提交
74
    --output_shape="1,${IMAGE_SIZE},${IMAGE_SIZE},2"\
L
Liangliang He 已提交
75 76 77
    --input_file=${PHONE_DATA_DIR}/${INPUT_FILE_NAME} \
    --output_file=${PHONE_DATA_DIR}/${OUTPUT_FILE_NAME} \
    --device=OPENCL   \
L
Liangliang He 已提交
78
    --round=$round
L
Liangliang He 已提交
79
}
L
liuqi 已提交
80

L
liuqi 已提交
81
echo "Step 1: Generate input data"
82 83
rm -rf ${MODEL_DIR}/${INPUT_FILE_NAME}
python tools/validate.py --generate_data true \
L
liuqi 已提交
84
 --input_file=${MODEL_DIR}/${INPUT_FILE_NAME} \
L
liuqi 已提交
85
 --input_shape="${IMAGE_SIZE},${IMAGE_SIZE},3"
L
liuqi 已提交
86

L
Liangliang He 已提交
87
echo "Step 2: Convert tf model to mace model and optimize memory"
88
bazel build //mace/python/tools:tf_converter
89
rm -rf ${MODEL_CODEGEN_DIR}
L
Liangliang He 已提交
90
mkdir -p ${MODEL_CODEGEN_DIR}
91
bazel-bin/mace/python/tools/tf_converter --input=${TF_MODEL_FILE_PATH} \
L
Liangliang He 已提交
92
                                         --output=${MODEL_CODEGEN_DIR}/mace_gcn${IMAGE_SIZE}.cc \
93 94
                                         --input_node=${TF_INPUT_NODE} \
                                         --output_node=${TF_OUTPUT_NODE} \
95 96 97 98 99 100
                                         --data_type=DT_HALF \
                                         --runtime=gpu \
                                         --output_type=source \
                                         --template=${MACE_SOURCE_DIR}/mace/python/tools/model.template \
                                         --model_tag=${MODEL_TAG} \
                                         --confuse=True
L
liuqi 已提交
101

L
liuqi 已提交
102 103 104 105 106
echo "Step 3: Generate version source"
rm -rf ${VERSION_SOURCE_PATH}
mkdir -p ${VERSION_SOURCE_PATH}
bash mace/tools/git/gen_version_source.sh ${VERSION_SOURCE_PATH}/version.cc

L
liuqi 已提交
107
echo "Step 4: Run model on the phone with files"
L
Liangliang He 已提交
108
build_and_run false
L
liuqi 已提交
109

L
liuqi 已提交
110
echo "Step 5: Generate OpenCL binary program and config code"
111
rm -rf ${CL_BIN_DIR}
L
Liangliang He 已提交
112 113 114 115 116
adb pull ${KERNEL_DIR} ${CL_BIN_DIR}
rm -rf ${CL_CODEGEN_DIR}
mkdir -p ${CL_CODEGEN_DIR}
python mace/python/tools/opencl_codegen.py \
  --cl_binary_dir=${CL_BIN_DIR} --output_path=${CL_CODEGEN_DIR}/opencl_compiled_program.cc
L
liuqi 已提交
117

L
liuqi 已提交
118
echo "Step 6: Generate tuning source file"
119 120 121 122 123
adb pull ${PHONE_DATA_DIR}/mace_run.config ${CL_BIN_DIR}
mkdir -p ${TUNING_CODEGEN_DIR}
python mace/python/tools/binary_codegen.py \
  --binary_file=${CL_BIN_DIR}/mace_run.config --output_path=${TUNING_CODEGEN_DIR}/tuning_params.cc

L
liuqi 已提交
124
echo "Step 7: Run model on the phone using binary"
L
Liangliang He 已提交
125
build_and_run true
L
liuqi 已提交
126

L
liuqi 已提交
127
echo "Step 8: Pull the mace run result."
L
liuqi 已提交
128 129
rm -rf ${MODEL_DIR}/${OUTPUT_FILE_NAME}
adb </dev/null pull ${PHONE_DATA_DIR}/${OUTPUT_FILE_NAME} ${MODEL_DIR}
L
liuqi 已提交
130

L
liuqi 已提交
131
echo "Step 9: Validate the result"
L
liuqi 已提交
132
python tools/validate.py --model_file ${TF_MODEL_FILE_PATH} \
L
liuqi 已提交
133 134
    --input_file ${MODEL_DIR}/${INPUT_FILE_NAME} \
    --mace_out_file ${MODEL_DIR}/${OUTPUT_FILE_NAME} \
135 136
    --input_node ${TF_INPUT_NODE} \
    --output_node ${TF_OUTPUT_NODE} \
L
liuqi 已提交
137 138
    --input_shape "${IMAGE_SIZE},${IMAGE_SIZE},3" \
    --output_shape "1,${IMAGE_SIZE},${IMAGE_SIZE},2"