@@ -9,47 +9,96 @@ set -exu
9
9
# shellcheck source=/dev/null
10
10
11
11
BUILD_TYPE=${1:- Debug}
12
+ TARGET_OS=${2:- Native}
13
+ BUILD_DIR=${3:- cmake-out}
12
14
13
- echo " Building with BUILD_TYPE: $BUILD_TYPE "
15
+ echo " Building with BUILD_TYPE: $BUILD_TYPE , TARGET_OS: $TARGET_OS , BUILD_DIR: $BUILD_DIR "
14
16
15
17
if [[ -z " ${PYTHON_EXECUTABLE:- } " ]]; then
16
- PYTHON_EXECUTABLE=python3
18
+ PYTHON_EXECUTABLE=python3
17
19
fi
18
20
21
+ TARGET_OS_lower=" $( echo " ${TARGET_OS} " | awk ' {print tolower($0)}' ) "
22
+ if [[ " ${TARGET_OS_lower} " == " android" ]]; then
23
+ if [[ -z " ${ANDROID_NDK} " ]]; then
24
+ echo " Set ANDROID_NDK environment variable to build for Android."
25
+ exit 1
26
+ fi
27
+ fi
28
+
29
+ # Number of processes for a parallel build
30
+ NPROC=8
31
+ if hash nproc & > /dev/null; then NPROC=$( nproc) ; fi
32
+
33
+ EXECUTORCH_COMMON_CMAKE_ARGS=" \
34
+ -DCMAKE_INSTALL_PREFIX=${BUILD_DIR} \
35
+ -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
36
+ -DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \
37
+ -DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON \
38
+ -DEXECUTORCH_BUILD_KERNELS_CUSTOM=ON \
39
+ -DEXECUTORCH_BUILD_KERNELS_OPTIMIZED=ON \
40
+ -DEXECUTORCH_BUILD_KERNELS_QUANTIZED=ON \
41
+ -DEXECUTORCH_BUILD_XNNPACK=ON \
42
+ -DEXECUTORCH_DO_NOT_USE_CXX11_ABI=ON \
43
+ -DEXECUTORCH_XNNPACK_SHARED_WORKSPACE=ON"
44
+
19
45
cmake_install_executorch_libraries () {
20
- cmake \
21
- -DCMAKE_INSTALL_PREFIX=cmake-out \
22
- -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
23
- -DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \
24
- -DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON \
25
- -DEXECUTORCH_BUILD_KERNELS_CUSTOM=ON \
26
- -DEXECUTORCH_BUILD_KERNELS_OPTIMIZED=ON \
27
- -DEXECUTORCH_BUILD_KERNELS_QUANTIZED=ON \
28
- -DEXECUTORCH_BUILD_XNNPACK=ON \
29
- -DEXECUTORCH_DO_NOT_USE_CXX11_ABI=ON \
30
- -DEXECUTORCH_XNNPACK_SHARED_WORKSPACE=ON \
31
- -Bcmake-out .
32
-
33
-
34
- cmake --build cmake-out -j9 --target install --config ${BUILD_TYPE}
46
+ cmake \
47
+ ${EXECUTORCH_COMMON_CMAKE_ARGS} \
48
+ -B${BUILD_DIR} .
49
+
50
+ cmake --build ${BUILD_DIR} -j${NPROC} --target install --config ${BUILD_TYPE}
51
+ }
52
+
53
+ cmake_install_executorch_libraries_for_android () {
54
+ cmake \
55
+ -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK /build/cmake/android.toolchain.cmake \
56
+ -DANDROID_ABI=arm64-v8a \
57
+ -DANDROID_PLATFORM=android-23 \
58
+ ${EXECUTORCH_COMMON_CMAKE_ARGS} \
59
+ -B${BUILD_DIR} .
60
+
61
+ cmake --build ${BUILD_DIR} -j${NPROC} --target install --config ${BUILD_TYPE}
35
62
}
36
63
64
+
65
+ LLAVA_COMMON_CMAKE_ARGS=" \
66
+ -DPYTHON_EXECUTABLE=" $PYTHON_EXECUTABLE " \
67
+ -DCMAKE_INSTALL_PREFIX=${BUILD_DIR} \
68
+ -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
69
+ -DEXECUTORCH_BUILD_KERNELS_CUSTOM=ON \
70
+ -DEXECUTORCH_BUILD_KERNELS_OPTIMIZED=ON \
71
+ -DEXECUTORCH_BUILD_XNNPACK=ON"
72
+
37
73
cmake_build_llava_runner () {
38
74
dir=examples/models/llava
39
75
python_lib=$( $PYTHON_EXECUTABLE -c ' from distutils.sysconfig import get_python_lib; print(get_python_lib())' )
40
76
41
- cmake \
42
- -DCMAKE_INSTALL_PREFIX=cmake-out \
43
- -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
44
- -DEXECUTORCH_BUILD_KERNELS_CUSTOM=ON \
45
- -DEXECUTORCH_BUILD_KERNELS_OPTIMIZED=ON \
46
- -DEXECUTORCH_BUILD_XNNPACK=ON \
47
- -DCMAKE_PREFIX_PATH=" $python_lib " \
48
- -Bcmake-out/${dir} \
77
+ cmake \
78
+ ${LLAVA_COMMON_CMAKE_ARGS} \
79
+ -DCMAKE_PREFIX_PATH=" $python_lib " \
80
+ -B${BUILD_DIR} /${dir} \
49
81
${dir}
50
82
83
+ cmake --build ${BUILD_DIR} /${dir} -j${NPROC} --config ${BUILD_TYPE}
84
+ }
85
+
51
86
52
- cmake --build cmake-out/${dir} -j9 --config ${BUILD_TYPE}
87
+ cmake_build_llava_runner_for_android () {
88
+ dir=examples/models/llava
89
+ python_lib=$( $PYTHON_EXECUTABLE -c ' from distutils.sysconfig import get_python_lib; print(get_python_lib())' )
90
+
91
+ cmake \
92
+ -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK /build/cmake/android.toolchain.cmake \
93
+ -DANDROID_ABI=arm64-v8a \
94
+ -DANDROID_PLATFORM=android-23 \
95
+ ${LLAVA_COMMON_CMAKE_ARGS} \
96
+ -DCMAKE_PREFIX_PATH=" $python_lib " \
97
+ -DLLAVA_RUNNER_NO_TORCH_DUMMY_IMAGE=ON \
98
+ -B${BUILD_DIR} /${dir} \
99
+ ${dir}
100
+
101
+ cmake --build ${BUILD_DIR} /${dir} -j${NPROC} --config ${BUILD_TYPE}
53
102
}
54
103
55
104
# only export the one without custom op for now since it's
@@ -61,7 +110,7 @@ export_llava() {
61
110
# Download a new image with different size, to test if the model can handle different image sizes
62
111
prepare_image_tensor () {
63
112
echo " Downloading image"
64
- curl -o basketball.jpg https://upload.wikimedia.org/wikipedia/commons/7/73/Chicago_Bulls_and_New_Jersey_Nets%2C_March_28%2C_1991.jpg
113
+ curl -o basketball.jpg https://upload.wikimedia.org/wikipedia/commons/7/73/Chicago_Bulls_and_New_Jersey_Nets%2C_March_28%2C_1991.jpg
65
114
$PYTHON_EXECUTABLE -m executorch.examples.models.llava.image_util --image-path basketball.jpg --output-path image.pt
66
115
}
67
116
@@ -80,13 +129,24 @@ run_and_verify() {
80
129
echo " tokenizer.bin is missing."
81
130
exit 1
82
131
fi
83
- RUNTIME_ARGS=" --model_path=llava.pte \
84
- --tokenizer_path=tokenizer.bin \
85
- --image_path=image.pt \
86
- --prompt=ASSISTANT: \
87
- --temperature=0 \
88
- --seq_len=650"
89
- cmake-out/examples/models/llava/llava_main ${RUNTIME_ARGS} > result.txt
132
+
133
+
134
+
135
+ RUNTIME_ARGS=" --model_path=llava.pte \
136
+ --tokenizer_path=tokenizer.bin \
137
+ --image_path=image.pt \
138
+ --prompt=ASSISTANT: \
139
+ --temperature=0 \
140
+ --seq_len=650"
141
+
142
+ if [[ " ${TARGET_OS_lower} " == " android" ]]; then
143
+ echo " Transfer relevant files to the phone via ADB and run llava_main with following args,"
144
+ echo " $ llava_main ${RUNTIME_ARGS} "
145
+ exit 0;
146
+ fi
147
+
148
+ ${BUILD_DIR} /examples/models/llava/llava_main ${RUNTIME_ARGS} > result.txt
149
+
90
150
# verify result.txt
91
151
RESULT=$( cat result.txt)
92
152
# set the expected prefix to be the same as prompt because there's a bug in sdpa_with_kv_cache that causes <unk> tokens.
@@ -109,8 +169,20 @@ run_and_verify() {
109
169
fi
110
170
}
111
171
112
- cmake_install_executorch_libraries
113
- cmake_build_llava_runner
172
+ # Step1. Build stuff
173
+ if [[ " ${TARGET_OS_lower} " == " android" ]]; then
174
+ cmake_install_executorch_libraries_for_android
175
+ cmake_build_llava_runner_for_android
176
+ elif [[ " ${TARGET_OS_lower} " == " native" ]]; then
177
+ cmake_install_executorch_libraries
178
+ cmake_build_llava_runner
179
+ else
180
+ echo " Invalid TARGET_OS ($2 ): ${TARGET_OS} "
181
+ fi
182
+
183
+ # Step2. Generate the PTE
114
184
export_llava
185
+
186
+ # Step3. Run
115
187
prepare_image_tensor
116
188
run_and_verify
0 commit comments