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

סקירה כללית

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

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

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

בטבלה הבאה אפשר לראות את ההשפעה של גרסאות build סלקטיביות לשימוש נפוץ. במקרים:

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

פיתוח סלקטיבי של LiteRT באמצעות Bazel

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

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

כדי ליצור מכשירים מותאמים אישית של LiteRT AAR, אפשר לספק את הנתיבים של קובצי המודלים כמפורט בהמשך.

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 אם המודלים מכילים בוחרים פעולות של 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 זמני, מריצים את הפקודה הבאה ברמה הבסיסית (root) של קוד המקור של 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++

אם רוצים ליצור אובייקט משותף מותאם אישית מסוג C++ ב-TFLite, צריך להוסיף את הקוד הבא לקובץ 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

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

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 Docker כאן.

לאחר הורדת קובץ ה-Docker שלמעלה, ניתן ליצור את קובץ האימג' של ה-Docker ריצה:

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

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

מורידים את הסקריפט לפיתוח באמצעות 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

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

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 של tensorflow-lite-select-tf-ops.aar בתור אם יוצרים אותו.

פיתוח סלקטיבי ל-iOS

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