הקטנת הגודל הבינארי של LiteRT

סקירה כללית

כשפורסים מודלים לאפליקציות של למידת מכונה במכשיר (ODML), חשוב להיות מודעים לזיכרון המוגבל שזמין במכשירים ניידים. גודלי הקבצים הבינאריים של המודלים קשורים באופן הדוק למספר הפעולות שנעשה בהן שימוש במודל. ‫LiteRT מאפשר לצמצם את הגודל של קובצי הבינארי של המודל באמצעות בנייה סלקטיבית. בבנייה סלקטיבית, המערכת מדלגת על פעולות שלא נעשה בהן שימוש בקבוצת המודלים, ומפיקה ספרייה קומפקטית שכוללת רק את זמן הריצה ואת ליבות הפעולות שנדרשות כדי שהמודל יפעל במכשיר הנייד.

הידור סלקטיבי חל על שלוש ספריות הפעולות הבאות.

  1. ספריית פעולות מובנית של LiteRT
  2. פעולות מותאמות אישית ב-LiteRT
  3. בחירת ספריית TensorFlow ops

בטבלה הבאה מוצגת ההשפעה של בנייה סלקטיבית בכמה תרחישי שימוש נפוצים:

שם דגם דומיין ארכיטקטורת היעד גודל קובץ ה-AAR
Mobilenet_1.0_224(float) סיווג תמונות armeabi-v7a ‫tensorflow-lite.aar (296,635 bytes)
arm64-v8a ‫tensorflow-lite.aar (382,892 bytes)
SPICE חילוץ גובה הצליל armeabi-v7a ‫tensorflow-lite.aar (375,813 bytes)
tensorflow-lite-select-tf-ops.aar (1,676,380 bytes)
arm64-v8a ‫tensorflow-lite.aar (421,826 bytes)
tensorflow-lite-select-tf-ops.aar (2,298,630 bytes)
i3d-kinetics-400 סיווג סרטונים armeabi-v7a ‫tensorflow-lite.aar (240,085 bytes)
tensorflow-lite-select-tf-ops.aar (1,708,597 bytes)
arm64-v8a ‫tensorflow-lite.aar (273,713 bytes)
tensorflow-lite-select-tf-ops.aar (2,339,697 bytes)

בנייה סלקטיבית של LiteRT באמצעות Bazel

בקטע הזה מניחים שהורדתם את קודי המקור של TensorFlow והגדרתם את סביבת הפיתוח המקומית ל-Bazel.

יצירת קובצי AAR לפרויקט Android

כדי ליצור את ספריות ה-AAR המותאמות אישית של LiteRT, צריך לספק את נתיבי קובצי המודל באופן הבא:

sh tensorflow/lite/tools/build_aar.sh \
  --input_models=/a/b/model_one.tflite,/c/d/model_two.tflite \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a

הפקודה שלמעלה תיצור את קובץ ה-AAR‏ bazel-bin/tmp/tensorflow-lite.aar בשביל פעולות מובנות ומותאמות אישית של LiteRT. בנוסף, היא יכולה ליצור את קובץ ה-AAR‏ bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar אם המודלים שלכם מכילים פעולות Select TensorFlow. שימו לב: הפקודה הזו יוצרת קובץ AAR גדול עם כמה ארכיטקטורות שונות. אם אתם לא צריכים את כולן, אתם יכולים להשתמש בקבוצת המשנה שמתאימה לסביבת הפריסה שלכם.

פיתוח באמצעות אופרטורים בהתאמה אישית

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

sh tensorflow/lite/tools/build_aar.sh \
  --input_models=/a/b/model_one.tflite,/c/d/model_two.tflite \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a \
  --tflite_custom_ops_srcs=/e/f/file1.cc,/g/h/file2.h \
  --tflite_custom_ops_deps=dep1,dep2

הדגל tflite_custom_ops_srcs מכיל קובצי מקור של פעולות בהתאמה אישית, והדגל tflite_custom_ops_deps מכיל תלות בבניית קובצי המקור האלה. שימו לב שרכיבי התלות האלה צריכים להיות קיימים במאגר TensorFlow.

שימושים מתקדמים: כללי Bazel בהתאמה אישית

אם אתם משתמשים ב-Bazel בפרויקט שלכם ורוצים להגדיר יחסי תלות מותאמים אישית של TFLite עבור קבוצה מסוימת של מודלים, אתם יכולים להגדיר את הכללים הבאים במאגר הפרויקט:

לגבי המודלים עם הפעולות המובנות בלבד:

load(
    "@org_tensorflow//tensorflow/lite:build_def.bzl",
    "tflite_custom_android_library",
    "tflite_custom_c_library",
    "tflite_custom_cc_library",
)

# A selectively built TFLite Android library.
tflite_custom_android_library(
    name = "selectively_built_android_lib",
    models = [
        ":model_one.tflite",
        ":model_two.tflite",
    ],
)

# A selectively built TFLite C library.
tflite_custom_c_library(
    name = "selectively_built_c_lib",
    models = [
        ":model_one.tflite",
        ":model_two.tflite",
    ],
)

# A selectively built TFLite C++ library.
tflite_custom_cc_library(
    name = "selectively_built_cc_lib",
    models = [
        ":model_one.tflite",
        ":model_two.tflite",
    ],
)

למודלים עם Select TF ops:

load(
    "@org_tensorflow//tensorflow/lite/delegates/flex:build_def.bzl",
    "tflite_flex_android_library",
    "tflite_flex_cc_library",
)

# A Select TF ops enabled selectively built TFLite Android library.
tflite_flex_android_library(
    name = "selective_built_tflite_flex_android_lib",
    models = [
        ":model_one.tflite",
        ":model_two.tflite",
    ],
)

# A Select TF ops enabled selectively built TFLite C++ library.
tflite_flex_cc_library(
    name = "selective_built_tflite_flex_cc_lib",
    models = [
        ":model_one.tflite",
        ":model_two.tflite",
    ],
)

שימושים מתקדמים: יצירת ספריות משותפות מותאמות אישית ב-C/C++‎

כדי ליצור אובייקטים משותפים של TFLite C/C++ בהתאמה אישית עבור המודלים שצוינו, אפשר לפעול לפי השלבים הבאים:

כדי ליצור קובץ BUILD זמני, מריצים את הפקודה הבאה בספריית הבסיס של קוד המקור של TensorFlow:

mkdir -p tmp && touch tmp/BUILD

יצירת אובייקטים משותפים מותאמים אישית ב-C

כדי ליצור אובייקט משותף של TFLite C בהתאמה אישית, מוסיפים את השורות הבאות לקובץ tmp/BUILD:

load(
    "//tensorflow/lite:build_def.bzl",
    "tflite_custom_c_library",
    "tflite_cc_shared_object",
)

tflite_custom_c_library(
    name = "selectively_built_c_lib",
    models = [
        ":model_one.tflite",
        ":model_two.tflite",
    ],
)

# Generates a platform-specific shared library containing the LiteRT C
# API implementation as define in `c_api.h`. The exact output library name
# is platform dependent:
#   - Linux/Android: `libtensorflowlite_c.so`
#   - Mac: `libtensorflowlite_c.dylib`
#   - Windows: `tensorflowlite_c.dll`
tflite_cc_shared_object(
    name = "tensorflowlite_c",
    linkopts = select({
        "//tensorflow:ios": [
            "-Wl,-exported_symbols_list,$(location //tensorflow/lite/c:exported_symbols.lds)",
        ],
        "//tensorflow:macos": [
            "-Wl,-exported_symbols_list,$(location //tensorflow/lite/c:exported_symbols.lds)",
        ],
        "//tensorflow:windows": [],
        "//conditions:default": [
            "-z defs",
            "-Wl,--version-script,$(location //tensorflow/lite/c:version_script.lds)",
        ],
    }),
    per_os_targets = True,
    deps = [
        ":selectively_built_c_lib",
        "//tensorflow/lite/c:exported_symbols.lds",
        "//tensorflow/lite/c:version_script.lds",
    ],
)

אפשר ליצור את היעד החדש שנוסף באופן הבא:

bazel build -c opt --cxxopt=--std=c++17 \
  //tmp:tensorflowlite_c

וב-Android (מחליפים את android_arm ב-android_arm64 לגרסת 64 ביט):

bazel build -c opt --cxxopt=--std=c++17 --config=android_arm \
  //tmp:tensorflowlite_c

יצירת אובייקטים משותפים מותאמים אישית ב-C++‎

אם רוצים ליצור אובייקט משותף מותאם אישית של TFLite C++‎, מוסיפים את השורה הבאה לקובץ tmp/BUILD:

load(
    "//tensorflow/lite:build_def.bzl",
    "tflite_custom_cc_library",
    "tflite_cc_shared_object",
)

tflite_custom_cc_library(
    name = "selectively_built_cc_lib",
    models = [
        ":model_one.tflite",
        ":model_two.tflite",
    ],
)

# Shared lib target for convenience, pulls in the core runtime and builtin ops.
# Note: This target is not yet finalized, and the exact set of exported (C/C++)
# APIs is subject to change. The output library name is platform dependent:
#   - Linux/Android: `libtensorflowlite.so`
#   - Mac: `libtensorflowlite.dylib`
#   - Windows: `tensorflowlite.dll`
tflite_cc_shared_object(
    name = "tensorflowlite",
    # Until we have more granular symbol export for the C++ API on Windows,
    # export all symbols.
    features = ["windows_export_all_symbols"],
    linkopts = select({
        "//tensorflow:macos": [
            "-Wl,-exported_symbols_list,$(location //tensorflow/lite:tflite_exported_symbols.lds)",
        ],
        "//tensorflow:windows": [],
        "//conditions:default": [
            "-Wl,-z,defs",
            "-Wl,--version-script,$(location //tensorflow/lite:tflite_version_script.lds)",
        ],
    }),
    per_os_targets = True,
    deps = [
        ":selectively_built_cc_lib",
        "//tensorflow/lite:tflite_exported_symbols.lds",
        "//tensorflow/lite:tflite_version_script.lds",
    ],
)

אפשר ליצור את היעד החדש שנוסף באופן הבא:

bazel build -c opt  --cxxopt=--std=c++17 \
  //tmp:tensorflowlite

וב-Android (מחליפים את android_arm ב-android_arm64 לגרסת 64 ביט):

bazel build -c opt --cxxopt=--std=c++17 --config=android_arm \
  //tmp:tensorflowlite

במודלים עם האפשרות Select TF ops, צריך גם ליצור את הספרייה המשותפת הבאה:

load(
    "@org_tensorflow//tensorflow/lite/delegates/flex:build_def.bzl",
    "tflite_flex_shared_library"
)

# Shared lib target for convenience, pulls in the standard set of TensorFlow
# ops and kernels. The output library name is platform dependent:
#   - Linux/Android: `libtensorflowlite_flex.so`
#   - Mac: `libtensorflowlite_flex.dylib`
#   - Windows: `libtensorflowlite_flex.dll`
tflite_flex_shared_library(
  name = "tensorflowlite_flex",
  models = [
      ":model_one.tflite",
      ":model_two.tflite",
  ],
)

אפשר ליצור את היעד החדש שנוסף באופן הבא:

bazel build -c opt --cxxopt='--std=c++17' \
      --config=monolithic \
      --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
      //tmp:tensorflowlite_flex

וב-Android (מחליפים את android_arm ב-android_arm64 לגרסת 64 ביט):

bazel build -c opt --cxxopt='--std=c++17' \
      --config=android_arm \
      --config=monolithic \
      --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
      //tmp:tensorflowlite_flex

יצירה סלקטיבית של LiteRT באמצעות Docker

בקטע הזה מניחים שהתקנתם את Docker במחשב המקומי והורדתם את קובץ LiteRT Dockerfile כאן.

אחרי שמורידים את קובץ Dockerfile שלמעלה, אפשר ליצור את קובץ האימג' של Docker על ידי הרצת הפקודה:

docker build . -t tflite-builder -f tflite-android.Dockerfile

יצירת קובצי AAR לפרויקט Android

כדי להוריד את הסקריפט ליצירת גרסת build באמצעות Docker, מריצים את הפקודה:

curl -o build_aar_with_docker.sh \
  https://raw.githubusercontent.com/tensorflow/tensorflow/master/tensorflow/lite/tools/build_aar_with_docker.sh &&
chmod +x build_aar_with_docker.sh

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

sh build_aar_with_docker.sh \
  --input_models=/a/b/model_one.tflite,/c/d/model_two.tflite \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a \
  --checkpoint=master \
  [--cache_dir=<path to cache directory>]

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

הפרמטר ‎--cache_dir מציין את ספריית המטמון. אם לא מספקים את הנתיב, הסקריפט יוצר ספרייה בשם bazel-build-cache בספריית העבודה הנוכחית לצורך שמירת נתונים במטמון.

הוספת קובצי AAR לפרויקט

כדי להוסיף קובצי AAR, אפשר לייבא את קובץ ה-AAR ישירות לפרויקט או לפרסם את קובץ ה-AAR המותאם אישית במאגר Maven המקומי. הערה: אם יוצרים את קובץ ה-AAR, צריך להוסיף גם את קובצי ה-AAR של tensorflow-lite-select-tf-ops.aar.

Selective Build for iOS

כדי להגדיר את סביבת הבנייה ולהגדיר את סביבת העבודה של TensorFlow, צריך לעיין בקטע Building locally ולפעול לפי המדריך לשימוש בסקריפט הבנייה הסלקטיבית ל-iOS.