@@ -14,7 +14,9 @@ GGUF_MODEL_NAME=/sdcard/qwen1_5-1_8b-chat-q4_0.gguf
14
14
# https://www.qualcomm.com/developer/software/qualcomm-ai-engine-direct-sdk
15
15
# https://developer.qualcomm.com/software/hexagon-dsp-sdk/tools
16
16
QNN_SDK_URL=https://www.qualcomm.com/developer/software/qualcomm-ai-engine-direct-sdk
17
- QNN_SDK_PATH=/opt/qcom/aistack/qairt/2.31.0.250130/
17
+ QNN_SDK_INSTALL_PATH=/opt/qcom/aistack/qairt/
18
+ QNN_SDK_VERSION=2.32.0.250228
19
+ QNN_SDK_PATH=${QNN_SDK_INSTALL_PATH} /${QNN_SDK_VERSION}
18
20
19
21
# default is QNN NPU
20
22
qnnbackend=2
@@ -32,11 +34,35 @@ function show_pwd()
32
34
}
33
35
34
36
35
- function check_qnn_sdk ()
37
+ function check_and_download_qnn_sdk ()
36
38
{
39
+ is_qnn_sdk_exist=1
40
+
37
41
if [ ! -d ${QNN_SDK_PATH} ]; then
38
- echo -e " QNN_SDK_PATH ${QNN_SDK_PATH} not exist, pls check or download it from ${QNN_SDK_URL} ...\n"
39
- exit 1
42
+ echo -e " QNN_SDK_PATH ${QNN_SDK_PATH} not exist, download it from ${QNN_SDK_URL} ...\n"
43
+ is_qnn_sdk_exist=0
44
+ fi
45
+
46
+ if [ ! -f ${QNN_SDK_PATH} /sdk.yaml ]; then
47
+ is_qnn_sdk_exist=0
48
+ fi
49
+
50
+ if [ ${is_qnn_sdk_exist} -eq 0 ]; then
51
+ echo " sudo mkdir -p ${QNN_SDK_INSTALL_PATH} "
52
+ sudo mkdir -p ${QNN_SDK_INSTALL_PATH}
53
+ if [ ! -f v${QNN_SDK_VERSION} .zip ]; then
54
+ wget --no-config --quiet --show-progress -O v${QNN_SDK_VERSION} .zip https://softwarecenter.qualcomm.com/api/download/software/sdks/Qualcomm_AI_Runtime_Community/All/${QNN_SDK_VERSION} /v${QNN_SDK_VERSION} .zip
55
+ fi
56
+ unzip v${QNN_SDK_VERSION} .zip
57
+ if [ $? -ne 0 ]; then
58
+ printf " failed to download Qualcomm QNN SDK to %s \n" " ${QNN_SDK_PATH} "
59
+ exit 1
60
+ fi
61
+ sudo mv qairt/${QNN_SDK_VERSION} ${QNN_SDK_INSTALL_PATH} /
62
+ printf " Qualcomm QNN SDK saved to ${QNN_SDK_PATH} \n\n"
63
+ sudo rm -rf qairt
64
+ else
65
+ printf " Qualcomm QNN SDK already exist:${QNN_SDK_PATH} \n\n"
40
66
fi
41
67
}
42
68
@@ -75,7 +101,7 @@ function check_and_download_ndk()
75
101
76
102
function build_arm64
77
103
{
78
- cmake -H. -B./out/android -DCMAKE_BUILD_TYPE=Release -DGGML_USE_QNN=ON -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK} /build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=latest -DCMAKE_C_FLAGS=-march=armv8.7-a -DGGML_QNN=ON -DGGML_QNN_SDK_PATH=${QNN_SDK_PATH}
104
+ cmake -H. -B./out/android -DCMAKE_BUILD_TYPE=Release -DGGML_OPENMP=OFF -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK} /build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=latest -DCMAKE_C_FLAGS=-march=armv8.7-a -DGGML_QNN=ON -DGGML_QNN_SDK_PATH=${QNN_SDK_PATH}
79
105
cd out/android
80
106
make -j16
81
107
show_pwd
@@ -97,11 +123,14 @@ function check_qnn_libs()
97
123
{
98
124
# reuse the cached qnn libs on Android phone
99
125
adb shell ls ${REMOTE_PATH} /libQnnCpu.so
126
+ adb shell ls ${REMOTE_PATH} /libQnnGpu.so
127
+ adb shell ls ${REMOTE_PATH} /libQnnHtp.so
100
128
if [ $? -eq 0 ]; then
101
129
printf " QNN libs already exist on Android phone\n"
102
130
else
103
131
update_qnn_libs
104
132
fi
133
+ update_qnn_cfg
105
134
}
106
135
107
136
@@ -119,11 +148,17 @@ function update_qnn_libs()
119
148
}
120
149
121
150
151
+ function update_qnn_cfg()
152
+ {
153
+ adb push ./scripts/ggml-qnn.cfg ${REMOTE_PATH} /
154
+ }
155
+
156
+
122
157
function build_ggml_qnn()
123
158
{
124
159
show_pwd
125
160
check_and_download_ndk
126
- check_qnn_sdk
161
+ check_and_download_qnn_sdk
127
162
dump_vars
128
163
remove_temp_dir
129
164
build_arm64
@@ -140,21 +175,20 @@ function prepare_run_on_phone()
140
175
141
176
check_qnn_libs
142
177
143
- if [ -f ./out/android/bin/libggml-qnn .so ]; then
178
+ if [ -f ./out/android/bin/libggml-cpu .so ]; then
144
179
adb push ./out/android/bin/* .so ${REMOTE_PATH} /
145
180
fi
146
181
adb push ./out/android/bin/${program} ${REMOTE_PATH} /
147
182
adb shell chmod +x ${REMOTE_PATH} /${program}
148
183
}
149
184
150
-
151
185
function run_llamacli()
152
186
{
153
187
prepare_run_on_phone llama-cli
154
188
155
189
adb shell " cd ${REMOTE_PATH} \
156
190
&& export LD_LIBRARY_PATH=${REMOTE_PATH} \
157
- && ${REMOTE_PATH} /llama-cli -mg ${qnnbackend} -no-cnv -m ${GGUF_MODEL_NAME} -p \" introduce the movie Once Upon a Time in America briefly.\n\" "
191
+ && ${REMOTE_PATH} /llama-cli -mg ${qnnbackend} -ngl 99 - no-cnv -m ${GGUF_MODEL_NAME} -p \" introduce the movie Once Upon a Time in America briefly.\n\" "
158
192
159
193
}
160
194
@@ -213,7 +247,6 @@ function run_test-op()
213
247
214
248
}
215
249
216
-
217
250
function print_oplist()
218
251
{
219
252
oplist=" DUP
@@ -302,7 +335,7 @@ function show_usage()
302
335
echo " $0 build"
303
336
echo " $0 updateqnnlib"
304
337
echo " $0 run_testops"
305
- echo " $0 run_testop [ADD/MUL/MUL_MAT/ ...(op from print_oplist)] [0 (QNN_CPU) / 1 (QNN_GPU) / 2 (QNN_NPU)]"
338
+ echo " $0 run_testop [ADD/MUL/MUL_MAT... ...(op from print_oplist)] [0 (QNN_CPU) / 1 (QNN_GPU) / 2 (QNN_NPU)]"
306
339
echo " $0 run_llamacli 0 (QNN_CPU) / 1 (QNN_GPU) / 2 (QNN_NPU) / 3 (ggml)"
307
340
echo " $0 run_llamabench 0 (QNN_CPU) / 1 (QNN_GPU) / 2 (QNN_NPU) / 3 (ggml)"
308
341
@@ -312,7 +345,8 @@ function show_usage()
312
345
313
346
show_pwd
314
347
315
- check_qnn_sdk
348
+ check_and_download_ndk
349
+ check_and_download_qnn_sdk
316
350
317
351
if [ $# == 0 ]; then
318
352
show_usage
@@ -343,20 +377,22 @@ elif [ $# == 1 ]; then
343
377
fi
344
378
elif [ $# == 2 ]; then
345
379
qnnbackend=$2
380
+ if [ ${qnnbackend} -gt 3 ]; then
381
+ show_usage
382
+ exit 1
383
+ fi
384
+
346
385
if [ " $1 " == " run_llamacli" ]; then
347
386
run_llamacli
348
387
exit 0
349
388
elif [ " $1 " == " run_llamabench" ]; then
350
389
run_llamabench
351
390
exit 0
352
- exit 0
353
- else
354
- show_usage
355
- exit 1
356
391
fi
357
392
elif [ $# == 3 ]; then
358
- # opname can be found via print_oplist:
359
393
opname=$2
394
+ # TODO: check opname in oplist
395
+ # opname can be found via print_oplist:
360
396
361
397
qnnbackend=$3
362
398
if [ ${qnnbackend} -gt 3 ]; then
0 commit comments