Build LiteRT ל-Android

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

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

כדי להשתמש בתמונות מצב ליליות, צריך להוסיף את המאגר הבא ל-build של ה-Root Gradle הגדרה

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.

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

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

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

עליך לאשר את התנאים וההגבלות כדי להוריד את חדש.

  • אפשר לשנות את ה-SDK ל-Android או את גרסת ה-NDK. מכניסים את הקבצים שהורדתם בקובץ Docker בתיקייה ריקה, יוצרים קובץ אימג' של Docker על ידי הרצת:
docker build . -t tflite-builder -f tflite-android.Dockerfile
  • כדי להפעיל את קונטיינר Docer באופן אינטראקטיבי, טוענים את התיקייה הנוכחית אל /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}"

עכשיו צריך להמשיך לקטע הגדרת WORKSPACE ו- .bazelrc כדי לקבוע את ההגדרות של ה-build.

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

הגדרה של סביבת build ללא Docker

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

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

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

הגדרת WORKSPACE ו- .bazelrc

זהו שלב הגדרה חד-פעמי שנדרש כדי לבנות את LiteRT של הספריות. מריצים את הסקריפט ./configure בשלב התשלום הבסיסי של TensorFlow ולענות 'כן'. כשהסקריפט מבקש להגדיר באופן אינטראקטיבי את ./WORKSPACE לגרסאות build של 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 בצורה נכונה, אפשר ליצור את LiteRT AAR מ את תיקיית ה-root:

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 בספרייה המקומית החדשה, e.g.:

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

מריצים את הפקודה הבאה מספריית התשלום הבסיסית (root):

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 בקוד האפליקציה.