Imported Upstream version 1.12.0
[platform/core/ml/nnfw.git] / tests / scripts / benchmark_nnapi.sh
1 #!/bin/bash
2 #
3 # Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 #    http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16
17 MY_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
18
19 source $MY_PATH/common.sh
20
21 BENCHMARK_DRIVER_BIN=
22 BENCHMARK_REPORT_DIR=
23 BENCHMARK_MODELS_FILE=
24 MODEL_TEST_ROOT_PATH=
25 TEST_OP="false"
26 BENCHMARK_MODEL_LIST="MODELS/inception_nonslim MODELS/inception_slim MODELS/mobilenet"
27 BACKEND_LIST="acl_cl acl_neon cpu" #TODO: accept this list as argument
28 EXECUTORS="Linear Parallel" #TODO: accept this list as argument
29
30 function Usage()
31 {
32     echo "Usage: ./$0 --reportdir=. --driverbin=Product/out/bin/tflite_run"
33 }
34
35 for i in "$@"
36 do
37     case $i in
38         -h|--help|help)
39             Usage
40             exit 1
41             ;;
42         --test_op)
43             TEST_OP="true"
44             ;;
45         --driverbin=*)
46             BENCHMARK_DRIVER_BIN=${i#*=}
47             ;;
48         --reportdir=*)
49             BENCHMARK_REPORT_DIR=${i#*=}
50             BENCHMARK_MODELS_FILE=$BENCHMARK_REPORT_DIR/benchmark_models.txt
51             ;;
52         --modelfilepath=*)
53             TEST_LIST_PATH=${i#*=}
54             MODEL_TEST_ROOT_PATH=$TEST_LIST_PATH/tests
55             ;;
56     esac
57     shift
58 done
59
60 function get_benchmark_op_list()
61 {
62     local TEST_DIRS="$@"
63     local TESTS_TO_RUN=""
64
65     if [[ $# -eq 0 ]]; then
66         TEST_DIRS="."
67     fi
68
69     shift $#
70
71     pushd $MODEL_TEST_ROOT_PATH > /dev/null
72     for DIR in $TEST_DIRS; do
73         if [ -d "$DIR" ]; then
74             TESTS_FOUND=$(find "$DIR" -type f -name 'config.sh' -exec dirname {} \;| sed 's|^./||' | grep -v '^MODELS/' | sort)
75             TESTS_TO_RUN="$TESTS_TO_RUN $TESTS_FOUND"
76         fi
77     done
78     popd > /dev/null
79
80     BENCHMARK_MODEL_LIST=$(echo "${TESTS_TO_RUN}")
81 }
82
83 function profile_for_he_shed()
84 {
85
86     local REPORT_MODEL_DIR=$1
87     local RUN_TEST_SH=$2
88     local BENCHMARK_DRIVER_BIN=$3
89     local MODEL=$4
90     local PROFILING_RUN_CNT=$5
91
92     export USE_SCHEDULER=1
93     export PROFILING_MODE=1
94     export EXECUTOR="Dataflow"
95     export ONERT_LOG_ENABLE=1
96
97     rm "exec_time.json" 2>/dev/null
98     for ((j = 1 ; j <= $PROFILING_RUN_CNT ; j++)); do
99         # Save the verbose log of each run
100         LOG_FILE=$REPORT_MODEL_DIR/tflite_profiling_$j.txt
101
102         print_with_dots "Profiling run #$j out of $PROFILING_RUN_CNT"
103
104         $RUN_TEST_SH --driverbin=$BENCHMARK_DRIVER_BIN $MODEL > $LOG_FILE 2>&1
105         RET=$?
106         if [[ $RET -ne 0 ]]; then
107             echo "Profiling $MODEL aborted in run#$j... exit code: $RET"
108             exit $RET
109         fi
110         echo "finished"
111         # Save the exec_time.json of each run
112         cp "exec_time.json" $REPORT_MODEL_DIR/"exec_time_$j.json"
113     done
114     unset USE_SCHEDULER PROFILING_MODE EXECUTOR ONERT_LOG_ENABLE
115 }
116
117 function run_with_he_scheduler()
118 {
119     local REPORT_MODEL_DIR=$1
120     local RUN_TEST_SH=$2
121     local BENCHMARK_DRIVER_BIN=$3
122     local MODEL=$4
123     local EXECUTOR=$5
124
125     LOG_FILE=$REPORT_MODEL_DIR/tflite_onert_with_he_scheduler_in_$EXECUTOR.txt
126     export EXECUTOR=$EXECUTOR
127     export GRAPH_DOT_DUMP=1
128     export USE_SCHEDULER=1
129     export ONERT_LOG_ENABLE=1
130
131     print_with_dots "TFLite onert $EXECUTOR with HEScheduler"
132
133     RESULT=$(get_result_of_benchmark_test $RUN_TEST_SH $BENCHMARK_DRIVER_BIN $MODEL $LOG_FILE)
134     echo "$RESULT ms"
135
136     mv "after_lower.dot" $REPORT_MODEL_DIR/"after_lower_$EXECUTOR.dot"
137     unset EXECUTOR GRAPH_DOT_DUMP USE_SCHEDULER ONERT_LOG_ENABLE
138 }
139
140 function run_onert_with_all_config()
141 {
142     local MODEL=$1
143     local REPORT_MODEL_DIR=$2
144     local PAUSE_TIME_IN_SEC=$3
145     local BENCHMARK_DRIVER_BIN=$4
146     local EXECUTORS=$5
147     local BACKEND_LIST=$6
148
149     export USE_NNAPI=1
150
151     # Run profiler BACKEND_CNT+1 times: on each run of the first BACKEND_CNT runs it will
152     #     collect metrics for one unmeasured backend. On the last run metrics for data transfer
153     PROFILING_RUN_CNT=1
154     BACKENDS_TO_USE=
155     for backend in $BACKEND_LIST; do
156         BACKENDS_TO_USE+=$backend';'
157         ((++PROFILING_RUN_CNT))
158     done
159     export BACKENDS=$BACKENDS_TO_USE
160     if [ "$TEST_OP" == "false" ]; then
161         profile_for_he_shed $REPORT_MODEL_DIR $BENCHMARK_DRIVER_BIN $MODEL $PROFILING_RUN_CNT
162     fi
163
164     for executor in $EXECUTORS; do
165         export EXECUTOR=$executor
166         if [ "$TEST_OP" == "false" ]; then
167             run_with_he_scheduler $REPORT_MODEL_DIR $BENCHMARK_DRIVER_BIN $MODEL $executor
168         fi
169         for backend in $BACKEND_LIST; do
170             export OP_BACKEND_ALLOPS=$backend
171             run_benchmark_and_print "tflite_onert_"$executor"_executor_$backend" "TFLite onert $executor Executor $backend"\
172                                     $MODEL $REPORT_MODEL_DIR 0 $BENCHMARK_DRIVER_BIN
173         done
174     done
175     unset USE_NNAPI EXECUTOR OP_BACKEND_ALLOPS BACKENDS
176 }
177
178 function run_benchmark_test()
179 {
180     local LOG_FILE=
181     local RESULT_FILE=
182     local RESULT=
183     local REPORT_MODEL_DIR=
184
185     export COUNT=5
186     export ONERT_LOG_ENABLE=1
187     echo
188     echo "============================================"
189     echo
190     date +'%Y-%m-%d %H:%M:%S %s'
191     echo
192     local i=0
193     for MODEL in $BENCHMARK_MODEL_LIST; do
194
195         STATUS="enabled"
196         if [ "$TEST_OP" == "true" ]; then
197             source $MODEL_TEST_ROOT_PATH/$MODEL/config.sh
198         fi
199
200         # Skip 'disabled' tests
201         if [ $(tr '[:upper:]' '[:lower:]' <<< "$STATUS") == "disabled" ]; then
202             continue
203         fi
204
205         echo "Benchmark test with `basename $BENCHMARK_DRIVER_BIN` & `echo $MODEL`"
206         echo $MODEL >> $BENCHMARK_MODELS_FILE
207
208         REPORT_MODEL_DIR=$BENCHMARK_REPORT_DIR/$MODEL
209         mkdir -p $REPORT_MODEL_DIR
210
211         # TFLite+CPU
212         unset USE_NNAPI
213         run_benchmark_and_print "tflite_cpu" "TFLite CPU" $MODEL $REPORT_MODEL_DIR 0 $BENCHMARK_DRIVER_BIN
214
215         # run onert
216         if [ "$TEST_OP" == "true" ]; then
217           # Operation test don't need to test each scheduler
218           run_onert_with_all_config $MODEL $REPORT_MODEL_DIR 0 $BENCHMARK_DRIVER_BIN "Linear" "$BACKEND_LIST"
219         else
220           run_onert_with_all_config $MODEL $REPORT_MODEL_DIR 0 $BENCHMARK_DRIVER_BIN "$EXECUTORS" "$BACKEND_LIST"
221         fi
222
223         if [[ $i -ne $(echo $BENCHMARK_MODEL_LIST | wc -w)-1 ]]; then
224             echo ""
225         fi
226         i=$((i+1))
227     done
228     echo "============================================"
229     unset COUNT
230 }
231
232 if [ ! -e "$BENCHMARK_REPORT_DIR" ]; then
233     mkdir -p $BENCHMARK_REPORT_DIR
234 fi
235
236 if [ "$TEST_OP" == "true" ]; then
237     get_benchmark_op_list
238 fi
239
240 rm -rf $BENCHMARK_MODELS_FILE
241
242 echo ""
243 # print the result AND append to log file
244 run_benchmark_test 2>&1 | tee -a onert_benchmarks.txt
245 echo ""