פיתוח TensorFlow Lite ל-Android

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

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

כדי להשתמש בקובצי snapshot מדי לילה, צריך להוסיף את המאגר הבא לתצורת ה-build של 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'
        }
    }
}

תוכלו להוסיף קובצי snapshot כל לילה ליחסי התלות (או לערוך לפי הצורך) ל-build.gradle

...
dependencies {
    ...
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly-SNAPSHOT'
    implementation 'org.tensorflow:tensorflow-lite-support:0.0.0-nightly-SNAPSHOT'
    ...
}
...

פיתוח מקומי של TensorFlow Lite

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

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

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

לחיצה על 'אישור' מהווה את הסכמתך לכך שכל השימוש ב-Android Studio וב-Android Native Development Kit יהיה כפוף להסכם הרישיון של ערכת הפיתוח לפיתוח תוכנה של Android שזמין בכתובת 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}"

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

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

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

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

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

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

הגדרת WORKSPACE ו- .bazelrc

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

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. לפרטים נוספים, ראו את הקטע הפחתת הגודל הבינארי של TensorFlow Lite.

הוספת AAR ישירות לפרויקט

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

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() ומחליפים את התלות הרגילה של TensorFlow Lite בזו שתומך בפעולות נבחרות ב-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 הרגילים של TensorFlow Lite Java בקוד האפליקציה.