@@ -14,7 +14,9 @@ GGUF_MODEL_NAME=/sdcard/qwen1_5-1_8b-chat-q4_0.gguf
1414# https://www.qualcomm.com/developer/software/qualcomm-ai-engine-direct-sdk
1515# https://developer.qualcomm.com/software/hexagon-dsp-sdk/tools
1616QNN_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}
1820
1921# default is QNN NPU
2022qnnbackend=2
@@ -32,11 +34,35 @@ function show_pwd()
3234}
3335
3436
35- function check_qnn_sdk ()
37+ function check_and_download_qnn_sdk ()
3638{
39+ is_qnn_sdk_exist=1
40+
3741 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"
4066 fi
4167}
4268
@@ -75,7 +101,7 @@ function check_and_download_ndk()
75101
76102function build_arm64
77103{
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}
79105 cd out/android
80106 make -j16
81107 show_pwd
@@ -97,11 +123,14 @@ function check_qnn_libs()
97123{
98124 # reuse the cached qnn libs on Android phone
99125 adb shell ls ${REMOTE_PATH} /libQnnCpu.so
126+ adb shell ls ${REMOTE_PATH} /libQnnGpu.so
127+ adb shell ls ${REMOTE_PATH} /libQnnHtp.so
100128 if [ $? -eq 0 ]; then
101129 printf " QNN libs already exist on Android phone\n"
102130 else
103131 update_qnn_libs
104132 fi
133+ update_qnn_cfg
105134}
106135
107136
@@ -119,11 +148,17 @@ function update_qnn_libs()
119148}
120149
121150
151+ function update_qnn_cfg()
152+ {
153+ adb push ./scripts/ggml-qnn.cfg ${REMOTE_PATH} /
154+ }
155+
156+
122157function build_ggml_qnn()
123158{
124159 show_pwd
125160 check_and_download_ndk
126- check_qnn_sdk
161+ check_and_download_qnn_sdk
127162 dump_vars
128163 remove_temp_dir
129164 build_arm64
@@ -140,21 +175,20 @@ function prepare_run_on_phone()
140175
141176 check_qnn_libs
142177
143- if [ -f ./out/android/bin/libggml-qnn .so ]; then
178+ if [ -f ./out/android/bin/libggml-cpu .so ]; then
144179 adb push ./out/android/bin/* .so ${REMOTE_PATH} /
145180 fi
146181 adb push ./out/android/bin/${program} ${REMOTE_PATH} /
147182 adb shell chmod +x ${REMOTE_PATH} /${program}
148183}
149184
150-
151185function run_llamacli()
152186{
153187 prepare_run_on_phone llama-cli
154188
155189 adb shell " cd ${REMOTE_PATH} \
156190 && 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\" "
158192
159193}
160194
@@ -213,7 +247,6 @@ function run_test-op()
213247
214248}
215249
216-
217250function print_oplist()
218251{
219252oplist=" DUP
@@ -302,7 +335,7 @@ function show_usage()
302335 echo " $0 build"
303336 echo " $0 updateqnnlib"
304337 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)]"
306339 echo " $0 run_llamacli 0 (QNN_CPU) / 1 (QNN_GPU) / 2 (QNN_NPU) / 3 (ggml)"
307340 echo " $0 run_llamabench 0 (QNN_CPU) / 1 (QNN_GPU) / 2 (QNN_NPU) / 3 (ggml)"
308341
@@ -312,7 +345,8 @@ function show_usage()
312345
313346show_pwd
314347
315- check_qnn_sdk
348+ check_and_download_ndk
349+ check_and_download_qnn_sdk
316350
317351if [ $# == 0 ]; then
318352 show_usage
@@ -343,20 +377,22 @@ elif [ $# == 1 ]; then
343377 fi
344378elif [ $# == 2 ]; then
345379 qnnbackend=$2
380+ if [ ${qnnbackend} -gt 3 ]; then
381+ show_usage
382+ exit 1
383+ fi
384+
346385 if [ " $1 " == " run_llamacli" ]; then
347386 run_llamacli
348387 exit 0
349388 elif [ " $1 " == " run_llamabench" ]; then
350389 run_llamabench
351390 exit 0
352- exit 0
353- else
354- show_usage
355- exit 1
356391 fi
357392elif [ $# == 3 ]; then
358- # opname can be found via print_oplist:
359393 opname=$2
394+ # TODO: check opname in oplist
395+ # opname can be found via print_oplist:
360396
361397 qnnbackend=$3
362398 if [ ${qnnbackend} -gt 3 ]; then
0 commit comments