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