From 1a077ff5945cefa11fc6cceb8a78c35445b5e68a Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Tue, 8 Apr 2025 16:12:30 -0700 Subject: [PATCH 01/11] Extra work --- .ci/scripts/build_android_instrumentation.sh | 21 -------------------- .github/workflows/_android.yml | 4 +++- scripts/build_android_library.sh | 2 ++ 3 files changed, 5 insertions(+), 22 deletions(-) delete mode 100644 .ci/scripts/build_android_instrumentation.sh diff --git a/.ci/scripts/build_android_instrumentation.sh b/.ci/scripts/build_android_instrumentation.sh deleted file mode 100644 index 747dd7063a2..00000000000 --- a/.ci/scripts/build_android_instrumentation.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the BSD-style license found in the -# LICENSE file in the root directory of this source tree. - -set -ex - -if [[ -z "${PYTHON_EXECUTABLE:-}" ]]; then - PYTHON_EXECUTABLE=python3 -fi -which "${PYTHON_EXECUTABLE}" - -mkdir -p extension/android/executorch_android/src/androidTest/resources -cp extension/module/test/resources/add.pte extension/android/executorch_android/src/androidTest/resources - -pushd extension/android -ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew :executorch_android:testDebugUnitTest -ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew :executorch_android:assembleAndroidTest -popd diff --git a/.github/workflows/_android.yml b/.github/workflows/_android.yml index 6598b6f3b42..c066af30d61 100644 --- a/.github/workflows/_android.yml +++ b/.github/workflows/_android.yml @@ -36,7 +36,9 @@ jobs: cp ${BUILD_AAR_DIR}/executorch.aar $ARTIFACTS_DIR_NAME mkdir -p ${ARTIFACTS_DIR_NAME}/library_test_dir - bash .ci/scripts/build_android_instrumentation.sh + mkdir -p extension/android/executorch_android/src/androidTest/resources + cp extension/module/test/resources/add.pte extension/android/executorch_android/src/androidTest/resources + (cd extension/android; ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew :executorch_android:assembleAndroidTest) cp extension/android/executorch_android/build/outputs/apk/androidTest/debug/executorch_android-debug-androidTest.apk "${ARTIFACTS_DIR_NAME}/library_test_dir" mkdir -p ${ARTIFACTS_DIR_NAME}/fp32-xnnpack-custom diff --git a/scripts/build_android_library.sh b/scripts/build_android_library.sh index 20450218de6..a32ac5f4e5b 100755 --- a/scripts/build_android_library.sh +++ b/scripts/build_android_library.sh @@ -119,6 +119,8 @@ build_aar() { fi pushd extension/android/ ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew build + # Use java unit test as sanity check + ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew :executorch_android:testDebugUnitTest popd cp extension/android/executorch_android/build/outputs/aar/executorch_android-debug.aar "${BUILD_AAR_DIR}/executorch.aar" } From 26811d006b2ddfe25578bc04b720e37b937deb20 Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Tue, 8 Apr 2025 16:56:32 -0700 Subject: [PATCH 02/11] Use a script --- .../executorch_android/android_test_setup.sh | 15 +++++++++++++++ extension/android/executorch_android/build.gradle | 4 ++++ 2 files changed, 19 insertions(+) create mode 100644 extension/android/executorch_android/android_test_setup.sh diff --git a/extension/android/executorch_android/android_test_setup.sh b/extension/android/executorch_android/android_test_setup.sh new file mode 100644 index 00000000000..f2e97bcb8cd --- /dev/null +++ b/extension/android/executorch_android/android_test_setup.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +set -ex + +if [[ -z "${PYTHON_EXECUTABLE:-}" ]]; then + PYTHON_EXECUTABLE=python3 +fi +which "${PYTHON_EXECUTABLE}" + +cp ../../../extension/module/test/resources/add.pte src/androidTest/resources diff --git a/extension/android/executorch_android/build.gradle b/extension/android/executorch_android/build.gradle index 70e18289442..b96a70960fb 100644 --- a/extension/android/executorch_android/build.gradle +++ b/extension/android/executorch_android/build.gradle @@ -36,6 +36,10 @@ android { } } +task copyTestRes(type: Exec) { + commandLine 'sh', 'android_test_setup.sh' +} + dependencies { implementation 'com.facebook.fbjni:fbjni:0.5.1' implementation 'com.facebook.soloader:nativeloader:0.10.5' From 8d1c4bef4564aa4d76da685e61647283c4be511e Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Tue, 8 Apr 2025 17:16:57 -0700 Subject: [PATCH 03/11] Fix the script --- .github/workflows/_android.yml | 2 -- .../executorch_android/android_test_setup.sh | 15 ++++++++++++++- .../executorch/LlmModuleInstrumentationTest.java | 2 +- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/.github/workflows/_android.yml b/.github/workflows/_android.yml index c066af30d61..ce10165af4b 100644 --- a/.github/workflows/_android.yml +++ b/.github/workflows/_android.yml @@ -36,8 +36,6 @@ jobs: cp ${BUILD_AAR_DIR}/executorch.aar $ARTIFACTS_DIR_NAME mkdir -p ${ARTIFACTS_DIR_NAME}/library_test_dir - mkdir -p extension/android/executorch_android/src/androidTest/resources - cp extension/module/test/resources/add.pte extension/android/executorch_android/src/androidTest/resources (cd extension/android; ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew :executorch_android:assembleAndroidTest) cp extension/android/executorch_android/build/outputs/apk/androidTest/debug/executorch_android-debug-androidTest.apk "${ARTIFACTS_DIR_NAME}/library_test_dir" diff --git a/extension/android/executorch_android/android_test_setup.sh b/extension/android/executorch_android/android_test_setup.sh index f2e97bcb8cd..7584528a509 100644 --- a/extension/android/executorch_android/android_test_setup.sh +++ b/extension/android/executorch_android/android_test_setup.sh @@ -12,4 +12,17 @@ if [[ -z "${PYTHON_EXECUTABLE:-}" ]]; then fi which "${PYTHON_EXECUTABLE}" -cp ../../../extension/module/test/resources/add.pte src/androidTest/resources +BASEDIR=$(dirname "$0") +cp "${BASEDIR}/../../../extension/module/test/resources/add.pte" "${BASEDIR}/src/androidTest/resources" + +pushd "${BASEDIR}/../../../" +curl -Ls "https://huggingface.co/karpathy/tinyllamas/resolve/main/stories110M.pt" --output stories110M.pt +curl -Ls "https://raw.githubusercontent.com/karpathy/llama2.c/master/tokenizer.model" --output tokenizer.model +# Create params.json file +touch params.json +echo '{"dim": 768, "multiple_of": 32, "n_heads": 12, "n_layers": 12, "norm_eps": 1e-05, "vocab_size": 32000}' > params.json +python -m examples.models.llama.export_llama -c stories110M.pt -p params.json -X -kv + +cp *.pte "${BASEDIR}/src/androidTest/resources/stories.pte" +cp *.bin "${BASEDIR}/src/androidTest/resources/tokenizer.bin" +popd diff --git a/extension/android/executorch_android/src/androidTest/java/org/pytorch/executorch/LlmModuleInstrumentationTest.java b/extension/android/executorch_android/src/androidTest/java/org/pytorch/executorch/LlmModuleInstrumentationTest.java index b3b515d7ed0..ae81a21f420 100644 --- a/extension/android/executorch_android/src/androidTest/java/org/pytorch/executorch/LlmModuleInstrumentationTest.java +++ b/extension/android/executorch_android/src/androidTest/java/org/pytorch/executorch/LlmModuleInstrumentationTest.java @@ -40,7 +40,7 @@ /** Unit tests for {@link org.pytorch.executorch.extension.llm.LlmModule}. */ @RunWith(AndroidJUnit4.class) public class LlmModuleInstrumentationTest implements LlmCallback { - private static String TEST_FILE_NAME = "/tinyllama_portable_fp16_h.pte"; + private static String TEST_FILE_NAME = "/stories.pte"; private static String TOKENIZER_FILE_NAME = "/tokenizer.bin"; private static String TEST_PROMPT = "Hello"; private static int OK = 0x00; From 25c85c53a01e54ecb391d26f47eabaddbe42def0 Mon Sep 17 00:00:00 2001 From: Hansong <107070759+kirklandsign@users.noreply.github.com> Date: Tue, 8 Apr 2025 22:33:08 -0700 Subject: [PATCH 04/11] Update _android.yml --- .github/workflows/_android.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/_android.yml b/.github/workflows/_android.yml index ce10165af4b..52b7e0bf87c 100644 --- a/.github/workflows/_android.yml +++ b/.github/workflows/_android.yml @@ -36,6 +36,7 @@ jobs: cp ${BUILD_AAR_DIR}/executorch.aar $ARTIFACTS_DIR_NAME mkdir -p ${ARTIFACTS_DIR_NAME}/library_test_dir + sh extension/android/executorch_android/android_test_setup.sh (cd extension/android; ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew :executorch_android:assembleAndroidTest) cp extension/android/executorch_android/build/outputs/apk/androidTest/debug/executorch_android-debug-androidTest.apk "${ARTIFACTS_DIR_NAME}/library_test_dir" From ed41ca81180c46b0e301c3b12fbfbd3e0f8f03d6 Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Tue, 8 Apr 2025 23:09:37 -0700 Subject: [PATCH 05/11] Fix --- .github/workflows/_android.yml | 2 +- extension/android/executorch_android/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/_android.yml b/.github/workflows/_android.yml index 52b7e0bf87c..8378d7ed4d9 100644 --- a/.github/workflows/_android.yml +++ b/.github/workflows/_android.yml @@ -36,7 +36,7 @@ jobs: cp ${BUILD_AAR_DIR}/executorch.aar $ARTIFACTS_DIR_NAME mkdir -p ${ARTIFACTS_DIR_NAME}/library_test_dir - sh extension/android/executorch_android/android_test_setup.sh + bash extension/android/executorch_android/android_test_setup.sh (cd extension/android; ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew :executorch_android:assembleAndroidTest) cp extension/android/executorch_android/build/outputs/apk/androidTest/debug/executorch_android-debug-androidTest.apk "${ARTIFACTS_DIR_NAME}/library_test_dir" diff --git a/extension/android/executorch_android/build.gradle b/extension/android/executorch_android/build.gradle index b96a70960fb..b1bc090759a 100644 --- a/extension/android/executorch_android/build.gradle +++ b/extension/android/executorch_android/build.gradle @@ -37,7 +37,7 @@ android { } task copyTestRes(type: Exec) { - commandLine 'sh', 'android_test_setup.sh' + commandLine 'bash', 'android_test_setup.sh' } dependencies { From 48c30a012ea4b3a0c8db6a3c2701358ef7806b0e Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Tue, 8 Apr 2025 23:54:14 -0700 Subject: [PATCH 06/11] Fix --- extension/android/executorch_android/android_test_setup.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extension/android/executorch_android/android_test_setup.sh b/extension/android/executorch_android/android_test_setup.sh index 7584528a509..c6b3b3a05a8 100644 --- a/extension/android/executorch_android/android_test_setup.sh +++ b/extension/android/executorch_android/android_test_setup.sh @@ -22,7 +22,8 @@ curl -Ls "https://raw.githubusercontent.com/karpathy/llama2.c/master/tokenizer.m touch params.json echo '{"dim": 768, "multiple_of": 32, "n_heads": 12, "n_layers": 12, "norm_eps": 1e-05, "vocab_size": 32000}' > params.json python -m examples.models.llama.export_llama -c stories110M.pt -p params.json -X -kv +python -m extension.llm.tokenizer.tokenizer -t tokenizer.model -o tokenizer.bin cp *.pte "${BASEDIR}/src/androidTest/resources/stories.pte" -cp *.bin "${BASEDIR}/src/androidTest/resources/tokenizer.bin" +cp tokenizer.bin "${BASEDIR}/src/androidTest/resources/tokenizer.bin" popd From a07e1b602a12bede39c4ec4ecb80430ef50acc91 Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Wed, 9 Apr 2025 00:40:52 -0700 Subject: [PATCH 07/11] Fix --- extension/android/executorch_android/android_test_setup.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/extension/android/executorch_android/android_test_setup.sh b/extension/android/executorch_android/android_test_setup.sh index c6b3b3a05a8..3d24249ec26 100644 --- a/extension/android/executorch_android/android_test_setup.sh +++ b/extension/android/executorch_android/android_test_setup.sh @@ -22,8 +22,7 @@ curl -Ls "https://raw.githubusercontent.com/karpathy/llama2.c/master/tokenizer.m touch params.json echo '{"dim": 768, "multiple_of": 32, "n_heads": 12, "n_layers": 12, "norm_eps": 1e-05, "vocab_size": 32000}' > params.json python -m examples.models.llama.export_llama -c stories110M.pt -p params.json -X -kv -python -m extension.llm.tokenizer.tokenizer -t tokenizer.model -o tokenizer.bin cp *.pte "${BASEDIR}/src/androidTest/resources/stories.pte" -cp tokenizer.bin "${BASEDIR}/src/androidTest/resources/tokenizer.bin" +cp tokenizer.model "${BASEDIR}/src/androidTest/resources/tokenizer.bin" popd From ebf751ffa1498f0eee8505b3ce497cd1222861a9 Mon Sep 17 00:00:00 2001 From: Hansong <107070759+kirklandsign@users.noreply.github.com> Date: Wed, 9 Apr 2025 19:46:46 -0700 Subject: [PATCH 08/11] Update android_test_setup.sh --- extension/android/executorch_android/android_test_setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/android/executorch_android/android_test_setup.sh b/extension/android/executorch_android/android_test_setup.sh index 3d24249ec26..68f4d9dd6f6 100644 --- a/extension/android/executorch_android/android_test_setup.sh +++ b/extension/android/executorch_android/android_test_setup.sh @@ -21,7 +21,7 @@ curl -Ls "https://raw.githubusercontent.com/karpathy/llama2.c/master/tokenizer.m # Create params.json file touch params.json echo '{"dim": 768, "multiple_of": 32, "n_heads": 12, "n_layers": 12, "norm_eps": 1e-05, "vocab_size": 32000}' > params.json -python -m examples.models.llama.export_llama -c stories110M.pt -p params.json -X -kv +python -m examples.models.llama.export_llama -c stories110M.pt -p params.json -X -kv --model=stories110m cp *.pte "${BASEDIR}/src/androidTest/resources/stories.pte" cp tokenizer.model "${BASEDIR}/src/androidTest/resources/tokenizer.bin" From dd69e7a2d79e1f6860725ef3436fe781692b9cb5 Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Thu, 10 Apr 2025 15:32:49 -0700 Subject: [PATCH 09/11] Add readme --- extension/android/README.md | 43 +++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 extension/android/README.md diff --git a/extension/android/README.md b/extension/android/README.md new file mode 100644 index 00000000000..c4df513919f --- /dev/null +++ b/extension/android/README.md @@ -0,0 +1,43 @@ +# ExecuTorch Android + +This directory contains the Android Java/Kotlin binding. The final product is an AAR, +which contains the `.so` libraries for c++ runtime, and `.jar` for Java API, and required +metadata `AndroidManifest.xml`. + +## Core contents + +Under `extension/android`, + +- `executorch_android/` is the root for the Java `org.pytorch.executorch` package + - `src/` + - `androidTest` contains the android instrumentation test source + - `main` contains the Java source + - `test` contains the Java unit test source + - `build.gradle` is the rule to build the Java package. +- `jni/` contains the JNI layer code, which depends on the ExecuTorch c++ runtime library. +- `CMakeLists.txt` is the rule for building the JNI library. + +## Build + +`scripts/build_android_library.sh` is a helper script to build the Java library (into .jar), native library (into .so), and the packaged AAR file. + +The usage is: +```sh +export ANDROID_HOME=/path/to/sdk +export ANDROID_NDK=/path/to/ndk +sh scripts/build_android_library.sh +``` + +Please see [Android building from source](https://pytorch.org/executorch/main/using-executorch-android.html#building-from-source) for details + +## Test + +After the library is built, + +```sh +# Run unit test +./gradlew :executorch_android:testDebugUnitTest + +# Run instrumentation test +./gradlew :executorch_android:connectedAndroidTest +``` From f8d49cf59ac62ee5f63a9e4868a7884049cb5c4c Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Thu, 10 Apr 2025 15:35:40 -0700 Subject: [PATCH 10/11] Format --- extension/android/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extension/android/README.md b/extension/android/README.md index c4df513919f..b3d662bd36a 100644 --- a/extension/android/README.md +++ b/extension/android/README.md @@ -6,14 +6,14 @@ metadata `AndroidManifest.xml`. ## Core contents -Under `extension/android`, +Under `extension/android/`, - `executorch_android/` is the root for the Java `org.pytorch.executorch` package - - `src/` - - `androidTest` contains the android instrumentation test source - - `main` contains the Java source - - `test` contains the Java unit test source - - `build.gradle` is the rule to build the Java package. + - `src/` + - `androidTest/` contains the android instrumentation test source + - `main/` contains the Java source + - `test/` contains the Java unit test source + - `build.gradle` is the rule to build the Java package. - `jni/` contains the JNI layer code, which depends on the ExecuTorch c++ runtime library. - `CMakeLists.txt` is the rule for building the JNI library. From 81e24e6f2327750260550905de99f4a483c39680 Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Thu, 10 Apr 2025 15:51:20 -0700 Subject: [PATCH 11/11] Fix docs --- extension/android/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extension/android/README.md b/extension/android/README.md index b3d662bd36a..8972e615173 100644 --- a/extension/android/README.md +++ b/extension/android/README.md @@ -35,6 +35,9 @@ Please see [Android building from source](https://pytorch.org/executorch/main/us After the library is built, ```sh +# Set up models for testing +sh executorch_android/android_test_setup.sh + # Run unit test ./gradlew :executorch_android:testDebugUnitTest