From 099e13038f34aef29fc4bf51ca67ff086c0bfa7b Mon Sep 17 00:00:00 2001 From: winskuo-quic Date: Wed, 13 Aug 2025 17:11:05 +0800 Subject: [PATCH 1/3] QNN 2.37 up level fix --- .ci/scripts/build-qnn-sdk.sh | 6 ++++-- .ci/scripts/setup-qnn-deps.sh | 1 + .ci/scripts/test_llama.sh | 8 +++++++- .ci/scripts/test_qnn_static_llama.sh | 7 ++++++- .github/workflows/android-perf.yml | 4 ++-- backends/qualcomm/scripts/install_qnn_sdk.sh | 12 +++++++----- backends/qualcomm/scripts/qnn_config.sh | 4 ++-- .../executorch/backends/qualcomm/qnn_version.bzl | 2 +- 8 files changed, 30 insertions(+), 14 deletions(-) diff --git a/.ci/scripts/build-qnn-sdk.sh b/.ci/scripts/build-qnn-sdk.sh index 971581eb053..7f34e8afb63 100755 --- a/.ci/scripts/build-qnn-sdk.sh +++ b/.ci/scripts/build-qnn-sdk.sh @@ -11,8 +11,10 @@ set -o xtrace build_qnn_backend() { echo "Start building qnn backend." - export ANDROID_NDK_ROOT=${ANDROID_NDK_ROOT:-/opt/ndk} - export QNN_SDK_ROOT=${QNN_SDK_ROOT:-/tmp/qnn/2.28.0.241029} + # Source QNN configuration + source "$(dirname "${BASH_SOURCE[0]}")/../../backends/qualcomm/scripts/install_qnn_sdk.sh" + setup_android_ndk + install_qnn export EXECUTORCH_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)" parallelism=$(( $(nproc) - 1 )) diff --git a/.ci/scripts/setup-qnn-deps.sh b/.ci/scripts/setup-qnn-deps.sh index d962f7b908a..9af688d5cb7 100644 --- a/.ci/scripts/setup-qnn-deps.sh +++ b/.ci/scripts/setup-qnn-deps.sh @@ -10,4 +10,5 @@ set -ex source "$(dirname "${BASH_SOURCE[0]}")/../../backends/qualcomm/scripts/install_qnn_sdk.sh" setup_libcpp 12 +setup_android_ndk install_qnn diff --git a/.ci/scripts/test_llama.sh b/.ci/scripts/test_llama.sh index 20fd7939a0d..87686f56021 100644 --- a/.ci/scripts/test_llama.sh +++ b/.ci/scripts/test_llama.sh @@ -119,8 +119,14 @@ echo "COREML option ${COREML}" if [[ "${MODE}" =~ .*qnn.* ]]; then QNN=ON + + # Source QNN configuration + source "$(dirname "${BASH_SOURCE[0]}")/../../backends/qualcomm/scripts/qnn_config.sh" + # Download QNN_SDK. If already downloaded, export environment path + source "$(dirname "${BASH_SOURCE[0]}")/../../backends/qualcomm/scripts/install_qnn_sdk.sh" + install_qnn + export EXECUTORCH_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" - export QNN_SDK_ROOT=/tmp/qnn/2.28.0.241029 export LD_LIBRARY_PATH="${QNN_SDK_ROOT}/lib/x86_64-linux-clang" export PYTHONPATH=".." cp schema/program.fbs exir/_serialize/program.fbs diff --git a/.ci/scripts/test_qnn_static_llama.sh b/.ci/scripts/test_qnn_static_llama.sh index d70eca81b69..0a708fea76a 100644 --- a/.ci/scripts/test_qnn_static_llama.sh +++ b/.ci/scripts/test_qnn_static_llama.sh @@ -9,8 +9,13 @@ set -euxo pipefail source "$(dirname "${BASH_SOURCE[0]}")/utils.sh" +# Source QNN configuration +source "$(dirname "${BASH_SOURCE[0]}")/../../backends/qualcomm/scripts/qnn_config.sh" +# Download QNN_SDK. If already downloaded, export environment path +source "$(dirname "${BASH_SOURCE[0]}")/../../backends/qualcomm/scripts/install_qnn_sdk.sh" +install_qnn + export EXECUTORCH_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" -export QNN_SDK_ROOT=/tmp/qnn/2.28.0.241029 export LD_LIBRARY_PATH="${QNN_SDK_ROOT}/lib/x86_64-linux-clang" export PYTHONPATH=".." cp schema/program.fbs exir/_serialize/program.fbs diff --git a/.github/workflows/android-perf.yml b/.github/workflows/android-perf.yml index 6f0e388fefd..81937ad6018 100644 --- a/.github/workflows/android-perf.yml +++ b/.github/workflows/android-perf.yml @@ -292,7 +292,7 @@ jobs: export.output_name="${OUT_ET_MODEL_NAME}.pte" ls -lh "${OUT_ET_MODEL_NAME}.pte" elif [[ ${{ matrix.config }} == "llama3_qnn_htp" ]]; then - export QNN_SDK_ROOT=/tmp/qnn/2.28.0.241029 + export QNN_SDK_ROOT=/tmp/qnn/2.37.0.25072 export LD_LIBRARY_PATH=$QNN_SDK_ROOT/lib/x86_64-linux-clang/ export PYTHONPATH=$(pwd)/.. @@ -432,7 +432,7 @@ jobs: PYTHON_EXECUTABLE=python bash .ci/scripts/build-qnn-sdk.sh mkdir -p aar-out - PYTHON_EXECUTABLE=python ANDROID_ABIS="arm64-v8a" BUILD_AAR_DIR=aar-out EXECUTORCH_BUILD_QNN=ON QNN_SDK_ROOT=/tmp/qnn/2.28.0.241029 EXECUTORCH_ANDROID_PROFILING=ON bash scripts/build_android_library.sh + PYTHON_EXECUTABLE=python ANDROID_ABIS="arm64-v8a" BUILD_AAR_DIR=aar-out EXECUTORCH_BUILD_QNN=ON QNN_SDK_ROOT=/tmp/qnn/2.37.0.25072 EXECUTORCH_ANDROID_PROFILING=ON bash scripts/build_android_library.sh mkdir -p extension/benchmark/android/benchmark/app/libs cp aar-out/executorch.aar extension/benchmark/android/benchmark/app/libs pushd extension/benchmark/android/benchmark diff --git a/backends/qualcomm/scripts/install_qnn_sdk.sh b/backends/qualcomm/scripts/install_qnn_sdk.sh index a8f9e63862d..a97d4258770 100644 --- a/backends/qualcomm/scripts/install_qnn_sdk.sh +++ b/backends/qualcomm/scripts/install_qnn_sdk.sh @@ -48,6 +48,12 @@ install_qnn() { echo "Start installing qnn v${QNN_VERSION}" QNN_INSTALLATION_DIR="/tmp/qnn" + + if [ -d "${QNN_INSTALLATION_DIR}/${QNN_VERSION}" ]; then + echo "QNN SDK already installed at ${QNN_INSTALLATION_DIR}/${QNN_VERSION}" + export QNN_SDK_ROOT="${QNN_INSTALLATION_DIR}/${QNN_VERSION}" + return + fi # Clean up any previous installation if [ -d "${QNN_INSTALLATION_DIR}" ]; then @@ -79,7 +85,7 @@ install_qnn() { ls -lah "${QNN_INSTALLATION_DIR}" # Set QNN_SDK_ROOT environment variable - export QNN_SDK_ROOT="${QNN_INSTALLATION_DIR}" + export QNN_SDK_ROOT="${QNN_INSTALLATION_DIR}/${QNN_VERSION}" echo "Set QNN_SDK_ROOT=${QNN_SDK_ROOT}" } @@ -147,7 +153,3 @@ setup_libcpp() { echo "libc++ installed to ${INSTALL_DIR}" } - -setup_libcpp 12 -setup_android_ndk -install_qnn diff --git a/backends/qualcomm/scripts/qnn_config.sh b/backends/qualcomm/scripts/qnn_config.sh index fe2d82e939e..938eb0d3007 100644 --- a/backends/qualcomm/scripts/qnn_config.sh +++ b/backends/qualcomm/scripts/qnn_config.sh @@ -6,5 +6,5 @@ # LICENSE file in the root directory of this source tree. # QNN SDK Configuration -QNN_VERSION="2.28.0.241029" -QNN_ZIP_URL="https://softwarecenter.qualcomm.com/api/download/software/qualcomm_neural_processing_sdk/v${QNN_VERSION}.zip" +QNN_VERSION="2.37.0.250724" +QNN_ZIP_URL="https://softwarecenter.qualcomm.com/api/download/software/sdks/Qualcomm_AI_Runtime_Community/All/${QNN_VERSION}/v${QNN_VERSION}.zip" diff --git a/shim_et/xplat/executorch/backends/qualcomm/qnn_version.bzl b/shim_et/xplat/executorch/backends/qualcomm/qnn_version.bzl index bd011748786..fd05d09efb4 100644 --- a/shim_et/xplat/executorch/backends/qualcomm/qnn_version.bzl +++ b/shim_et/xplat/executorch/backends/qualcomm/qnn_version.bzl @@ -1,2 +1,2 @@ def get_qnn_library_version(): - return "2.28" + return "2.37" From 0c872a316e93b1ea33e1bdcd445155843d46bbb0 Mon Sep 17 00:00:00 2001 From: winskuo-quic Date: Thu, 28 Aug 2025 13:09:53 +0800 Subject: [PATCH 2/3] Remove unused --- .ci/scripts/test_llama.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/.ci/scripts/test_llama.sh b/.ci/scripts/test_llama.sh index 87686f56021..0422f8114bb 100644 --- a/.ci/scripts/test_llama.sh +++ b/.ci/scripts/test_llama.sh @@ -120,8 +120,6 @@ echo "COREML option ${COREML}" if [[ "${MODE}" =~ .*qnn.* ]]; then QNN=ON - # Source QNN configuration - source "$(dirname "${BASH_SOURCE[0]}")/../../backends/qualcomm/scripts/qnn_config.sh" # Download QNN_SDK. If already downloaded, export environment path source "$(dirname "${BASH_SOURCE[0]}")/../../backends/qualcomm/scripts/install_qnn_sdk.sh" install_qnn From ebb55e12b5beaab2d49daa29221d22f0f6d49fd8 Mon Sep 17 00:00:00 2001 From: winskuo-quic Date: Thu, 28 Aug 2025 15:04:10 +0800 Subject: [PATCH 3/3] Code review --- .github/workflows/android-release-artifacts.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/android-release-artifacts.yml b/.github/workflows/android-release-artifacts.yml index 1e6057ac3ef..f0b74342eb8 100644 --- a/.github/workflows/android-release-artifacts.yml +++ b/.github/workflows/android-release-artifacts.yml @@ -104,7 +104,7 @@ jobs: source backends/qualcomm/scripts/qnn_config.sh export QNN_SDK_ROOT="/tmp/qnn/${QNN_VERSION}" export ANDROID_ABIS=arm64-v8a - GRADLE_ARGS+=" -DqnnVersion=2.28.0" + GRADLE_ARGS+=" -DqnnVersion=2.37.0" fi # Build AAR Package