xref: /aosp_15_r20/external/executorch/.ci/scripts/test_model.sh (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker#!/bin/bash
2*523fa7a6SAndroid Build Coastguard Worker# Copyright (c) Meta Platforms, Inc. and affiliates.
3*523fa7a6SAndroid Build Coastguard Worker# All rights reserved.
4*523fa7a6SAndroid Build Coastguard Worker#
5*523fa7a6SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the
6*523fa7a6SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree.
7*523fa7a6SAndroid Build Coastguard Worker
8*523fa7a6SAndroid Build Coastguard Workerset -exu
9*523fa7a6SAndroid Build Coastguard Worker
10*523fa7a6SAndroid Build Coastguard Worker# shellcheck source=/dev/null
11*523fa7a6SAndroid Build Coastguard Workersource "$(dirname "${BASH_SOURCE[0]}")/utils.sh"
12*523fa7a6SAndroid Build Coastguard Worker
13*523fa7a6SAndroid Build Coastguard WorkerMODEL_NAME=$1
14*523fa7a6SAndroid Build Coastguard Workerif [[ -z "${MODEL_NAME:-}" ]]; then
15*523fa7a6SAndroid Build Coastguard Worker  echo "Missing model name, exiting..."
16*523fa7a6SAndroid Build Coastguard Worker  exit 1
17*523fa7a6SAndroid Build Coastguard Workerfi
18*523fa7a6SAndroid Build Coastguard Worker
19*523fa7a6SAndroid Build Coastguard WorkerBUILD_TOOL=$2
20*523fa7a6SAndroid Build Coastguard Workerif [[ -z "${BUILD_TOOL:-}" ]]; then
21*523fa7a6SAndroid Build Coastguard Worker  echo "Missing build tool (require buck2 or cmake), exiting..."
22*523fa7a6SAndroid Build Coastguard Worker  exit 1
23*523fa7a6SAndroid Build Coastguard Workerfi
24*523fa7a6SAndroid Build Coastguard Worker
25*523fa7a6SAndroid Build Coastguard WorkerBACKEND=$3
26*523fa7a6SAndroid Build Coastguard Workerif [[ -z "${BACKEND:-}" ]]; then
27*523fa7a6SAndroid Build Coastguard Worker  echo "Missing backend (require portable or xnnpack), exiting..."
28*523fa7a6SAndroid Build Coastguard Worker  exit 1
29*523fa7a6SAndroid Build Coastguard Workerfi
30*523fa7a6SAndroid Build Coastguard Worker
31*523fa7a6SAndroid Build Coastguard WorkerUPLOAD_DIR=${4:-}
32*523fa7a6SAndroid Build Coastguard Worker
33*523fa7a6SAndroid Build Coastguard Workerif [[ -z "${PYTHON_EXECUTABLE:-}" ]]; then
34*523fa7a6SAndroid Build Coastguard Worker  PYTHON_EXECUTABLE=python3
35*523fa7a6SAndroid Build Coastguard Workerfi
36*523fa7a6SAndroid Build Coastguard Workerwhich "${PYTHON_EXECUTABLE}"
37*523fa7a6SAndroid Build Coastguard Worker
38*523fa7a6SAndroid Build Coastguard Worker# Just set this variable here, it's cheap even if we use buck2
39*523fa7a6SAndroid Build Coastguard WorkerCMAKE_OUTPUT_DIR=cmake-out
40*523fa7a6SAndroid Build Coastguard WorkerEXPORTED_MODEL=${MODEL_NAME}
41*523fa7a6SAndroid Build Coastguard Worker
42*523fa7a6SAndroid Build Coastguard Workerprepare_artifacts_upload() {
43*523fa7a6SAndroid Build Coastguard Worker  if [ -n "$UPLOAD_DIR" ]; then
44*523fa7a6SAndroid Build Coastguard Worker    echo "Preparing for uploading generated artifacs"
45*523fa7a6SAndroid Build Coastguard Worker    zip -j model.zip "${EXPORTED_MODEL}"
46*523fa7a6SAndroid Build Coastguard Worker    mkdir -p "${UPLOAD_DIR}"
47*523fa7a6SAndroid Build Coastguard Worker    mv model.zip "${UPLOAD_DIR}"
48*523fa7a6SAndroid Build Coastguard Worker  fi
49*523fa7a6SAndroid Build Coastguard Worker}
50*523fa7a6SAndroid Build Coastguard Worker
51*523fa7a6SAndroid Build Coastguard Workerbuild_cmake_executor_runner() {
52*523fa7a6SAndroid Build Coastguard Worker  echo "Building executor_runner"
53*523fa7a6SAndroid Build Coastguard Worker  rm -rf ${CMAKE_OUTPUT_DIR}
54*523fa7a6SAndroid Build Coastguard Worker  cmake -DCMAKE_BUILD_TYPE=Debug \
55*523fa7a6SAndroid Build Coastguard Worker      -DEXECUTORCH_BUILD_KERNELS_OPTIMIZED=ON \
56*523fa7a6SAndroid Build Coastguard Worker      -DPYTHON_EXECUTABLE="$PYTHON_EXECUTABLE" \
57*523fa7a6SAndroid Build Coastguard Worker      -B${CMAKE_OUTPUT_DIR} .
58*523fa7a6SAndroid Build Coastguard Worker
59*523fa7a6SAndroid Build Coastguard Worker  cmake --build ${CMAKE_OUTPUT_DIR} -j4 --config Debug
60*523fa7a6SAndroid Build Coastguard Worker}
61*523fa7a6SAndroid Build Coastguard Worker
62*523fa7a6SAndroid Build Coastguard Workerrun_portable_executor_runner() {
63*523fa7a6SAndroid Build Coastguard Worker  # Run test model
64*523fa7a6SAndroid Build Coastguard Worker  if [[ "${BUILD_TOOL}" == "buck2" ]]; then
65*523fa7a6SAndroid Build Coastguard Worker    buck2 run //examples/portable/executor_runner:executor_runner -- --model_path "./${MODEL_NAME}.pte"
66*523fa7a6SAndroid Build Coastguard Worker  elif [[ "${BUILD_TOOL}" == "cmake" ]]; then
67*523fa7a6SAndroid Build Coastguard Worker    build_cmake_executor_runner
68*523fa7a6SAndroid Build Coastguard Worker    ./${CMAKE_OUTPUT_DIR}/executor_runner --model_path "./${MODEL_NAME}.pte"
69*523fa7a6SAndroid Build Coastguard Worker  else
70*523fa7a6SAndroid Build Coastguard Worker    echo "Invalid build tool ${BUILD_TOOL}. Only buck2 and cmake are supported atm"
71*523fa7a6SAndroid Build Coastguard Worker    exit 1
72*523fa7a6SAndroid Build Coastguard Worker  fi
73*523fa7a6SAndroid Build Coastguard Worker}
74*523fa7a6SAndroid Build Coastguard Worker
75*523fa7a6SAndroid Build Coastguard Workertest_model() {
76*523fa7a6SAndroid Build Coastguard Worker  if [[ "${MODEL_NAME}" == "llama2" ]]; then
77*523fa7a6SAndroid Build Coastguard Worker    # Install requirements for export_llama
78*523fa7a6SAndroid Build Coastguard Worker    bash examples/models/llama/install_requirements.sh
79*523fa7a6SAndroid Build Coastguard Worker    # Test export_llama script: python3 -m examples.models.llama.export_llama
80*523fa7a6SAndroid Build Coastguard Worker    "${PYTHON_EXECUTABLE}" -m examples.models.llama.export_llama --model "${MODEL_NAME}" -c examples/models/llama/params/demo_rand_params.pth -p examples/models/llama/params/demo_config.json
81*523fa7a6SAndroid Build Coastguard Worker    run_portable_executor_runner
82*523fa7a6SAndroid Build Coastguard Worker    rm "./${MODEL_NAME}.pte"
83*523fa7a6SAndroid Build Coastguard Worker  fi
84*523fa7a6SAndroid Build Coastguard Worker  STRICT="--strict"
85*523fa7a6SAndroid Build Coastguard Worker  if [[ "${MODEL_NAME}" == "llava" ]]; then
86*523fa7a6SAndroid Build Coastguard Worker    # Install requirements for llava
87*523fa7a6SAndroid Build Coastguard Worker    bash examples/models/llava/install_requirements.sh
88*523fa7a6SAndroid Build Coastguard Worker    STRICT="--no-strict"
89*523fa7a6SAndroid Build Coastguard Worker  fi
90*523fa7a6SAndroid Build Coastguard Worker  if [[ "$MODEL_NAME" == "llama3_2_vision_encoder" || "$MODEL_NAME" == "llama3_2_text_decoder" ]]; then
91*523fa7a6SAndroid Build Coastguard Worker    # Install requirements for llama vision.
92*523fa7a6SAndroid Build Coastguard Worker    bash examples/models/llama3_2_vision/install_requirements.sh
93*523fa7a6SAndroid Build Coastguard Worker  fi
94*523fa7a6SAndroid Build Coastguard Worker  # python3 -m examples.portable.scripts.export --model_name="llama2" should works too
95*523fa7a6SAndroid Build Coastguard Worker  "${PYTHON_EXECUTABLE}" -m examples.portable.scripts.export --model_name="${MODEL_NAME}" "${STRICT}"
96*523fa7a6SAndroid Build Coastguard Worker  run_portable_executor_runner
97*523fa7a6SAndroid Build Coastguard Worker}
98*523fa7a6SAndroid Build Coastguard Worker
99*523fa7a6SAndroid Build Coastguard Workerbuild_cmake_xnn_executor_runner() {
100*523fa7a6SAndroid Build Coastguard Worker  echo "Building xnn_executor_runner"
101*523fa7a6SAndroid Build Coastguard Worker  SITE_PACKAGES="$(${PYTHON_EXECUTABLE} -c 'from distutils.sysconfig import get_python_lib; print(get_python_lib())')"
102*523fa7a6SAndroid Build Coastguard Worker  CMAKE_PREFIX_PATH="${SITE_PACKAGES}/torch"
103*523fa7a6SAndroid Build Coastguard Worker
104*523fa7a6SAndroid Build Coastguard Worker  (rm -rf ${CMAKE_OUTPUT_DIR} \
105*523fa7a6SAndroid Build Coastguard Worker    && mkdir ${CMAKE_OUTPUT_DIR} \
106*523fa7a6SAndroid Build Coastguard Worker    && cd ${CMAKE_OUTPUT_DIR} \
107*523fa7a6SAndroid Build Coastguard Worker    && retry cmake -DCMAKE_BUILD_TYPE=Release \
108*523fa7a6SAndroid Build Coastguard Worker      -DEXECUTORCH_BUILD_XNNPACK=ON \
109*523fa7a6SAndroid Build Coastguard Worker      -DCMAKE_PREFIX_PATH="$CMAKE_PREFIX_PATH" \
110*523fa7a6SAndroid Build Coastguard Worker      -DPYTHON_EXECUTABLE="$PYTHON_EXECUTABLE" ..)
111*523fa7a6SAndroid Build Coastguard Worker
112*523fa7a6SAndroid Build Coastguard Worker  cmake --build ${CMAKE_OUTPUT_DIR} -j4
113*523fa7a6SAndroid Build Coastguard Worker}
114*523fa7a6SAndroid Build Coastguard Worker
115*523fa7a6SAndroid Build Coastguard Workertest_model_with_xnnpack() {
116*523fa7a6SAndroid Build Coastguard Worker  WITH_QUANTIZATION=$1
117*523fa7a6SAndroid Build Coastguard Worker  WITH_DELEGATION=$2
118*523fa7a6SAndroid Build Coastguard Worker
119*523fa7a6SAndroid Build Coastguard Worker  # Quantization-only
120*523fa7a6SAndroid Build Coastguard Worker  if [[ ${WITH_QUANTIZATION} == true ]] && [[ ${WITH_DELEGATION} == false ]]; then
121*523fa7a6SAndroid Build Coastguard Worker    bash examples/xnnpack/quantization/test_quantize.sh "${BUILD_TOOL}" "${MODEL_NAME}"
122*523fa7a6SAndroid Build Coastguard Worker    return 0
123*523fa7a6SAndroid Build Coastguard Worker  fi
124*523fa7a6SAndroid Build Coastguard Worker
125*523fa7a6SAndroid Build Coastguard Worker  # Delegation
126*523fa7a6SAndroid Build Coastguard Worker  if [[ ${WITH_QUANTIZATION} == true ]]; then
127*523fa7a6SAndroid Build Coastguard Worker    SUFFIX="q8"
128*523fa7a6SAndroid Build Coastguard Worker    "${PYTHON_EXECUTABLE}" -m examples.xnnpack.aot_compiler --model_name="${MODEL_NAME}" --delegate --quantize
129*523fa7a6SAndroid Build Coastguard Worker  else
130*523fa7a6SAndroid Build Coastguard Worker    SUFFIX="fp32"
131*523fa7a6SAndroid Build Coastguard Worker    "${PYTHON_EXECUTABLE}" -m examples.xnnpack.aot_compiler --model_name="${MODEL_NAME}" --delegate
132*523fa7a6SAndroid Build Coastguard Worker  fi
133*523fa7a6SAndroid Build Coastguard Worker
134*523fa7a6SAndroid Build Coastguard Worker  OUTPUT_MODEL_PATH="${MODEL_NAME}_xnnpack_${SUFFIX}.pte"
135*523fa7a6SAndroid Build Coastguard Worker  EXPORTED_MODEL=${OUTPUT_MODEL_PATH}
136*523fa7a6SAndroid Build Coastguard Worker
137*523fa7a6SAndroid Build Coastguard Worker  # Run test model
138*523fa7a6SAndroid Build Coastguard Worker  if [[ "${BUILD_TOOL}" == "buck2" ]]; then
139*523fa7a6SAndroid Build Coastguard Worker    buck2 run //examples/xnnpack:xnn_executor_runner -- --model_path "${OUTPUT_MODEL_PATH}"
140*523fa7a6SAndroid Build Coastguard Worker  elif [[ "${BUILD_TOOL}" == "cmake" ]]; then
141*523fa7a6SAndroid Build Coastguard Worker    if [[ ! -f ${CMAKE_OUTPUT_DIR}/backends/xnnpack/xnn_executor_runner ]]; then
142*523fa7a6SAndroid Build Coastguard Worker      build_cmake_xnn_executor_runner
143*523fa7a6SAndroid Build Coastguard Worker    fi
144*523fa7a6SAndroid Build Coastguard Worker    ./${CMAKE_OUTPUT_DIR}/backends/xnnpack/xnn_executor_runner --model_path "${OUTPUT_MODEL_PATH}"
145*523fa7a6SAndroid Build Coastguard Worker  else
146*523fa7a6SAndroid Build Coastguard Worker    echo "Invalid build tool ${BUILD_TOOL}. Only buck2 and cmake are supported atm"
147*523fa7a6SAndroid Build Coastguard Worker    exit 1
148*523fa7a6SAndroid Build Coastguard Worker  fi
149*523fa7a6SAndroid Build Coastguard Worker}
150*523fa7a6SAndroid Build Coastguard Worker
151*523fa7a6SAndroid Build Coastguard Workertest_model_with_qnn() {
152*523fa7a6SAndroid Build Coastguard Worker  source "$(dirname "${BASH_SOURCE[0]}")/build-qnn-sdk.sh"
153*523fa7a6SAndroid Build Coastguard Worker  echo "ANDROID_NDK_ROOT: $ANDROID_NDK_ROOT"
154*523fa7a6SAndroid Build Coastguard Worker  echo "QNN_SDK_ROOT: $QNN_SDK_ROOT"
155*523fa7a6SAndroid Build Coastguard Worker  echo "EXECUTORCH_ROOT: $EXECUTORCH_ROOT"
156*523fa7a6SAndroid Build Coastguard Worker
157*523fa7a6SAndroid Build Coastguard Worker  export LD_LIBRARY_PATH=$QNN_SDK_ROOT/lib/x86_64-linux-clang/
158*523fa7a6SAndroid Build Coastguard Worker  export PYTHONPATH=$EXECUTORCH_ROOT/..
159*523fa7a6SAndroid Build Coastguard Worker
160*523fa7a6SAndroid Build Coastguard Worker  if [[ "${MODEL_NAME}" == "dl3" ]]; then
161*523fa7a6SAndroid Build Coastguard Worker    EXPORT_SCRIPT=deeplab_v3
162*523fa7a6SAndroid Build Coastguard Worker  elif [[ "${MODEL_NAME}" == "mv3" ]]; then
163*523fa7a6SAndroid Build Coastguard Worker    EXPORT_SCRIPT=mobilenet_v3
164*523fa7a6SAndroid Build Coastguard Worker  elif [[ "${MODEL_NAME}" == "mv2" ]]; then
165*523fa7a6SAndroid Build Coastguard Worker    EXPORT_SCRIPT=mobilenet_v2
166*523fa7a6SAndroid Build Coastguard Worker  elif [[ "${MODEL_NAME}" == "ic4" ]]; then
167*523fa7a6SAndroid Build Coastguard Worker    EXPORT_SCRIPT=inception_v4
168*523fa7a6SAndroid Build Coastguard Worker  elif [[ "${MODEL_NAME}" == "ic3" ]]; then
169*523fa7a6SAndroid Build Coastguard Worker    EXPORT_SCRIPT=inception_v3
170*523fa7a6SAndroid Build Coastguard Worker  elif [[ "${MODEL_NAME}" == "vit" ]]; then
171*523fa7a6SAndroid Build Coastguard Worker    EXPORT_SCRIPT=torchvision_vit
172*523fa7a6SAndroid Build Coastguard Worker  fi
173*523fa7a6SAndroid Build Coastguard Worker
174*523fa7a6SAndroid Build Coastguard Worker  # Use SM8450 for S22, SM8550 for S23, and SM8560 for S24
175*523fa7a6SAndroid Build Coastguard Worker  # TODO(guangyang): Make QNN chipset matches the target device
176*523fa7a6SAndroid Build Coastguard Worker  QNN_CHIPSET=SM8450
177*523fa7a6SAndroid Build Coastguard Worker
178*523fa7a6SAndroid Build Coastguard Worker  "${PYTHON_EXECUTABLE}" -m examples.qualcomm.scripts.${EXPORT_SCRIPT} -b ${CMAKE_OUTPUT_DIR} -m ${QNN_CHIPSET} --compile_only
179*523fa7a6SAndroid Build Coastguard Worker  EXPORTED_MODEL=$(find "./${EXPORT_SCRIPT}" -type f -name "${MODEL_NAME}*.pte" -print -quit)
180*523fa7a6SAndroid Build Coastguard Worker}
181*523fa7a6SAndroid Build Coastguard Worker
182*523fa7a6SAndroid Build Coastguard Workertest_model_with_coreml() {
183*523fa7a6SAndroid Build Coastguard Worker  if [[ "${BUILD_TOOL}" == "buck2" ]]; then
184*523fa7a6SAndroid Build Coastguard Worker    echo "coreml doesn't support buck2."
185*523fa7a6SAndroid Build Coastguard Worker    exit 1
186*523fa7a6SAndroid Build Coastguard Worker  fi
187*523fa7a6SAndroid Build Coastguard Worker
188*523fa7a6SAndroid Build Coastguard Worker  DTYPE=float16
189*523fa7a6SAndroid Build Coastguard Worker
190*523fa7a6SAndroid Build Coastguard Worker  "${PYTHON_EXECUTABLE}" -m examples.apple.coreml.scripts.export --model_name="${MODEL_NAME}" --compute_precision "${DTYPE}"
191*523fa7a6SAndroid Build Coastguard Worker  EXPORTED_MODEL=$(find "." -type f -name "${MODEL_NAME}*.pte" -print -quit)
192*523fa7a6SAndroid Build Coastguard Worker  # TODO:
193*523fa7a6SAndroid Build Coastguard Worker  if [ -n "$EXPORTED_MODEL" ]; then
194*523fa7a6SAndroid Build Coastguard Worker    EXPORTED_MODEL_WITH_DTYPE="${EXPORTED_MODEL%.pte}_${DTYPE}.pte"
195*523fa7a6SAndroid Build Coastguard Worker    mv "$EXPORTED_MODEL" "$EXPORTED_MODEL_WITH_DTYPE"
196*523fa7a6SAndroid Build Coastguard Worker    EXPORTED_MODEL="$EXPORTED_MODEL_WITH_DTYPE"
197*523fa7a6SAndroid Build Coastguard Worker    echo "Renamed file path: $EXPORTED_MODEL"
198*523fa7a6SAndroid Build Coastguard Worker  else
199*523fa7a6SAndroid Build Coastguard Worker    echo "No .pte file found"
200*523fa7a6SAndroid Build Coastguard Worker    exit 1
201*523fa7a6SAndroid Build Coastguard Worker  fi
202*523fa7a6SAndroid Build Coastguard Worker}
203*523fa7a6SAndroid Build Coastguard Worker
204*523fa7a6SAndroid Build Coastguard Workertest_model_with_mps() {
205*523fa7a6SAndroid Build Coastguard Worker  "${PYTHON_EXECUTABLE}" -m examples.apple.mps.scripts.mps_example --model_name="${MODEL_NAME}" --use_fp16
206*523fa7a6SAndroid Build Coastguard Worker  EXPORTED_MODEL=$(find "." -type f -name "${MODEL_NAME}*.pte" -print -quit)
207*523fa7a6SAndroid Build Coastguard Worker  # TODO:
208*523fa7a6SAndroid Build Coastguard Worker  if [ -n "$EXPORTED_MODEL" ]; then
209*523fa7a6SAndroid Build Coastguard Worker    EXPORTED_MODEL_WITH_DTYPE="${EXPORTED_MODEL%.pte}_${DTYPE}.pte"
210*523fa7a6SAndroid Build Coastguard Worker    mv "$EXPORTED_MODEL" "$EXPORTED_MODEL_WITH_DTYPE"
211*523fa7a6SAndroid Build Coastguard Worker    EXPORTED_MODEL="$EXPORTED_MODEL_WITH_DTYPE"
212*523fa7a6SAndroid Build Coastguard Worker    echo "Renamed file path: $EXPORTED_MODEL"
213*523fa7a6SAndroid Build Coastguard Worker  else
214*523fa7a6SAndroid Build Coastguard Worker    echo "No .pte file found"
215*523fa7a6SAndroid Build Coastguard Worker    exit 1
216*523fa7a6SAndroid Build Coastguard Worker  fi
217*523fa7a6SAndroid Build Coastguard Worker}
218*523fa7a6SAndroid Build Coastguard Worker
219*523fa7a6SAndroid Build Coastguard Workerif [[ "${BACKEND}" == "portable" ]]; then
220*523fa7a6SAndroid Build Coastguard Worker  echo "Testing ${MODEL_NAME} with portable kernels..."
221*523fa7a6SAndroid Build Coastguard Worker  test_model
222*523fa7a6SAndroid Build Coastguard Workerelif [[ "${BACKEND}" == "qnn" ]]; then
223*523fa7a6SAndroid Build Coastguard Worker  echo "Testing ${MODEL_NAME} with qnn..."
224*523fa7a6SAndroid Build Coastguard Worker  test_model_with_qnn
225*523fa7a6SAndroid Build Coastguard Worker  if [[ $? -eq 0 ]]; then
226*523fa7a6SAndroid Build Coastguard Worker    prepare_artifacts_upload
227*523fa7a6SAndroid Build Coastguard Worker  fi
228*523fa7a6SAndroid Build Coastguard Workerelif [[ "${BACKEND}" == "coreml" ]]; then
229*523fa7a6SAndroid Build Coastguard Worker  echo "Testing ${MODEL_NAME} with coreml..."
230*523fa7a6SAndroid Build Coastguard Worker  test_model_with_coreml
231*523fa7a6SAndroid Build Coastguard Worker  if [[ $? -eq 0 ]]; then
232*523fa7a6SAndroid Build Coastguard Worker    prepare_artifacts_upload
233*523fa7a6SAndroid Build Coastguard Worker  fi
234*523fa7a6SAndroid Build Coastguard Workerelif [[ "${BACKEND}" == "mps" ]]; then
235*523fa7a6SAndroid Build Coastguard Worker  echo "Testing ${MODEL_NAME} with mps..."
236*523fa7a6SAndroid Build Coastguard Worker  test_model_with_mps
237*523fa7a6SAndroid Build Coastguard Worker  if [[ $? -eq 0 ]]; then
238*523fa7a6SAndroid Build Coastguard Worker    prepare_artifacts_upload
239*523fa7a6SAndroid Build Coastguard Worker  fi
240*523fa7a6SAndroid Build Coastguard Workerelif [[ "${BACKEND}" == "xnnpack" ]]; then
241*523fa7a6SAndroid Build Coastguard Worker  echo "Testing ${MODEL_NAME} with xnnpack..."
242*523fa7a6SAndroid Build Coastguard Worker  WITH_QUANTIZATION=true
243*523fa7a6SAndroid Build Coastguard Worker  WITH_DELEGATION=true
244*523fa7a6SAndroid Build Coastguard Worker  if [[ "$MODEL_NAME" == "mobilebert" ]]; then
245*523fa7a6SAndroid Build Coastguard Worker    # TODO(T197452682)
246*523fa7a6SAndroid Build Coastguard Worker    WITH_QUANTIZATION=false
247*523fa7a6SAndroid Build Coastguard Worker  fi
248*523fa7a6SAndroid Build Coastguard Worker  test_model_with_xnnpack "${WITH_QUANTIZATION}" "${WITH_DELEGATION}"
249*523fa7a6SAndroid Build Coastguard Worker  if [[ $? -eq 0 ]]; then
250*523fa7a6SAndroid Build Coastguard Worker    prepare_artifacts_upload
251*523fa7a6SAndroid Build Coastguard Worker  fi
252*523fa7a6SAndroid Build Coastguard Workerelse
253*523fa7a6SAndroid Build Coastguard Worker  set +e
254*523fa7a6SAndroid Build Coastguard Worker  if [[ "${BACKEND}" == *"quantization"* ]]; then
255*523fa7a6SAndroid Build Coastguard Worker    echo "::group::Testing ${MODEL_NAME} with XNNPACK quantization only..."
256*523fa7a6SAndroid Build Coastguard Worker    test_model_with_xnnpack true false || Q_ERROR="error"
257*523fa7a6SAndroid Build Coastguard Worker    echo "::endgroup::"
258*523fa7a6SAndroid Build Coastguard Worker  fi
259*523fa7a6SAndroid Build Coastguard Worker  if [[ "${BACKEND}" == *"delegation"* ]]; then
260*523fa7a6SAndroid Build Coastguard Worker    echo "::group::Testing ${MODEL_NAME} with XNNPACK delegation only..."
261*523fa7a6SAndroid Build Coastguard Worker    test_model_with_xnnpack false true || D_ERROR="error"
262*523fa7a6SAndroid Build Coastguard Worker    echo "::endgroup::"
263*523fa7a6SAndroid Build Coastguard Worker  fi
264*523fa7a6SAndroid Build Coastguard Worker  if [[ "${BACKEND}" == *"quantization"* ]] && [[ "${BACKEND}" == *"delegation"* ]]; then
265*523fa7a6SAndroid Build Coastguard Worker    echo "::group::Testing ${MODEL_NAME} with XNNPACK quantization and delegation..."
266*523fa7a6SAndroid Build Coastguard Worker    test_model_with_xnnpack true true || Q_D_ERROR="error"
267*523fa7a6SAndroid Build Coastguard Worker    echo "::endgroup::"
268*523fa7a6SAndroid Build Coastguard Worker  fi
269*523fa7a6SAndroid Build Coastguard Worker  set -e
270*523fa7a6SAndroid Build Coastguard Worker  if [[ -n "${Q_ERROR:-}" ]] || [[ -n "${D_ERROR:-}" ]] || [[ -n "${Q_D_ERROR:-}" ]]; then
271*523fa7a6SAndroid Build Coastguard Worker    echo "Portable q8 ${Q_ERROR:-ok}," "Delegation fp32 ${D_ERROR:-ok}," "Delegation q8 ${Q_D_ERROR:-ok}"
272*523fa7a6SAndroid Build Coastguard Worker    exit 1
273*523fa7a6SAndroid Build Coastguard Worker  else
274*523fa7a6SAndroid Build Coastguard Worker    prepare_artifacts_upload
275*523fa7a6SAndroid Build Coastguard Worker  fi
276*523fa7a6SAndroid Build Coastguard Workerfi
277