Build LiteRT ל-Android

במאמר הזה מוסבר איך ליצור בעצמכם ספריית Android של LiteRT. בדרך כלל, אין צורך לבנות באופן מקומי את ספריית LiteRT Android.

שימוש בתמונות מצב יומיות

כדי להשתמש בתמונות מצב יומיות, מוסיפים את המאגר הבא להגדרת ה-build של Gradle ברמה הבסיסית (root).

allprojects {
    repositories {      // should be already there
        mavenCentral()  // should be already there
        maven {         // add this repo to use snapshots
          name 'ossrh-snapshot'
          url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
    }
}

מוסיפים תמונות מצב ליליות לתלויות (או עורכים לפי הצורך) בקובץ build.gradle

...
dependencies {
    ...
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    implementation 'com.google.ai.edge.litert:litert-gpu:0.0.0-nightly-SNAPSHOT'
    implementation 'com.google.ai.edge.litert:litert-support:0.0.0-nightly-SNAPSHOT'
    ...
}
...

פיתוח LiteRT באופן מקומי

במקרים מסוימים, יכול להיות שתרצו להשתמש בגרסת build מקומית של LiteRT. לדוגמה, יכול להיות שאתם בונים קובץ בינארי בהתאמה אישית שכולל פעולות שנבחרו מ-TensorFlow, או שאתם רוצים לבצע שינויים מקומיים ב-LiteRT.

הגדרה של סביבת פיתוח באמצעות Docker

  • מורידים את קובץ Docker. הורדת קובץ Docker מבטאת את הסכמתך לתנאים ולהגבלות הבאים שחלים על השימוש בו:

בלחיצה על 'אישור', אתם מסכימים שכל השימוש ב-Android Studio וב-Android Native Development Kit יהיה כפוף להסכם הרישיון של Android Software Development Kit שזמין בכתובת https://developer.android.com/studio/terms (יכול להיות ש-Google תעדכן או תשנה את כתובת ה-URL הזו מעת לעת).

כדי להוריד את הקובץ, צריך לאשר את התנאים וההגבלות.

  • אפשר לשנות את גרסת Android SDK או NDK. מכניסים את קובץ ה-Docker שהורד לתיקייה ריקה ומריצים את הפקודה הבאה כדי ליצור את קובץ האימג' של Docker:
docker build . -t tflite-builder -f tflite-android.Dockerfile
  • מפעילים את מאגר Docker באופן אינטראקטיבי על ידי העלאת התיקייה הנוכחית אל /host_dir בתוך המאגר (שימו לב ש-/tensorflow_src הוא מאגר TensorFlow בתוך המאגר):
docker run -it -v $PWD:/host_dir tflite-builder bash

אם משתמשים ב-PowerShell ב-Windows, מחליפים את ‎$PWD ב-pwd.

אם רוצים להשתמש במאגר TensorFlow במארח, צריך להעלות את ספריית המארח במקום זאת (-v hostDir:/host_dir).

  • אחרי שנכנסים למאגר, אפשר להריץ את הפקודה הבאה כדי להוריד כלים וספריות נוספים של Android (שימו לב שאולי תצטרכו לאשר את הרישיון):
sdkmanager \
  "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \
  "platform-tools" \
  "platforms;android-${ANDROID_API_LEVEL}"

עכשיו צריך לעבור לקטע Configure WORKSPACE and .bazelrc כדי להגדיר את הגדרות הבנייה.

אחרי שמסיימים ליצור את הספריות, אפשר להעתיק אותן ל-‎ /host_dir בתוך הקונטיינר כדי שתוכלו לגשת אליהן במארח.

הגדרת סביבת פיתוח ללא Docker

התקנה של Bazel ודרישות מוקדמות ל-Android

‫Bazel היא מערכת ה-build העיקרית של TensorFlow. כדי לפתח באמצעות ה-SDK, צריך להתקין אותו, את Android NDK ואת Android SDK במערכת.

  1. מתקינים את הגרסה האחרונה של מערכת ה-build של Bazel.
  2. כדי ליצור את הקוד המקורי (C/C++) של LiteRT, צריך להשתמש ב-Android NDK. הגרסה המומלצת הנוכחית היא 25b, ואפשר למצוא אותה כאן.
    1. אפשר להוריד את Android SDK ואת כלי ה-build כאן, או כחלק מ-Android Studio. כלי פיתוח ‫API בגרסה 23 ומעלה היא הגרסה המומלצת לפיתוח LiteRT.

הגדרת WORKSPACE ו-‎ .bazelrc

זהו שלב הגדרה חד-פעמי שנדרש כדי ליצור את ספריות LiteRT. מריצים את הסקריפט ./configure בספריית השורש של TensorFlow checkout ועונים 'Yes' (כן) כשמוצגת השאלה אם רוצים להגדיר את ./WORKSPACE באופן אינטראקטיבי עבור בניית Android. הסקריפט ינסה להגדיר את ההגדרות באמצעות משתני הסביבה הבאים:

  • ANDROID_SDK_HOME
  • ANDROID_SDK_API_LEVEL
  • ANDROID_NDK_HOME
  • ANDROID_NDK_API_LEVEL

אם המשתנים האלה לא מוגדרים, צריך לספק אותם באופן אינטראקטיבי בהנחיה של הסקריפט. אם ההגדרה בוצעה בהצלחה, יופיעו רשומות דומות לאלה בקובץ .tf_configure.bazelrc בתיקיית השורש:

build --action_env ANDROID_NDK_HOME="/usr/local/android/android-ndk-r25b"
build --action_env ANDROID_NDK_API_LEVEL="21"
build --action_env ANDROID_BUILD_TOOLS_VERSION="30.0.3"
build --action_env ANDROID_SDK_API_LEVEL="30"
build --action_env ANDROID_SDK_HOME="/usr/local/android/android-sdk-linux"

יצירה והתקנה

אחרי שמגדירים את Bazel בצורה נכונה, אפשר ליצור את קובץ ה-AAR של LiteRT מספריית השורש של הצ'ק-אאוט באופן הבא:

bazel build -c opt --cxxopt=--std=c++17 --config=android_arm64 \
  --fat_apk_cpu=x86,x86_64,arm64-v8a,armeabi-v7a \
  --define=android_dexmerger_tool=d8_dexmerger \
  --define=android_incremental_dexing_tool=d8_dexbuilder \
  //tensorflow/lite/java:tensorflow-lite

הפעולה הזו תיצור קובץ AAR ב-bazel-bin/tensorflow/lite/java/. שימו לב: הפקודה הזו יוצרת קובץ AAR גדול עם כמה ארכיטקטורות שונות. אם אתם לא צריכים את כולן, השתמשו בקבוצת המשנה שמתאימה לסביבת הפריסה שלכם.

אפשר ליצור קובצי AAR קטנים יותר שמיועדים רק לקבוצה של מודלים, באופן הבא:

bash tensorflow/lite/tools/build_aar.sh \
  --input_models=model1,model2 \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a

הסקריפט שלמעלה ייצור את הקובץ tensorflow-lite.aar ואופציונלית את הקובץ tensorflow-lite-select-tf-ops.aar אם אחד מהמודלים משתמש בפעולות של TensorFlow. פרטים נוספים זמינים בקטע הקטנת הגודל של קובץ הבינארי של LiteRT.

הוספת המלצות שיושמו באופן אוטומטי (AAR) ישירות לפרויקט

מעבירים את הקובץ tensorflow-lite.aar לספרייה בשם libs בפרויקט. משנים את קובץ build.gradle של האפליקציה כך שיפנה לספרייה החדשה ומחליפים את יחסי התלות הקיימים ב-LiteRT בספרייה המקומית החדשה, לדוגמה:

allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        flatDir {
            dirs 'libs'
        }
    }
}

dependencies {
    compile(name:'tensorflow-lite', ext:'aar')
}

התקנת AAR במאגר Maven מקומי

מריצים את הפקודה הבאה מהספרייה הראשית של הצ'קאאוט:

mvn install:install-file \
  -Dfile=bazel-bin/tensorflow/lite/java/tensorflow-lite.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite -Dversion=0.1.100 -Dpackaging=aar

ב-build.gradle של האפליקציה, מוודאים שיש תלות ב-mavenLocal() ומחליפים את התלות הרגילה ב-LiteRT בזו שתומכת בפעולות נבחרות של TensorFlow:

allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        mavenLocal()
    }
}

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.1.100'
}

שימו לב שהגרסה 0.1.100 כאן מיועדת אך ורק לבדיקה או לפיתוח. אחרי שמתקינים את ה-AAR המקומי, אפשר להשתמש בממשקי ה-API הרגילים של LiteRT Java להסקת מסקנות בקוד האפליקציה.