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

סקירה

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

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

  1. ספריית הפעולות המובנית של TensorFlow Lite
  2. פעולות מותאמות אישית של TensorFlow Lite
  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 בייטים)

פיתוח סלקטיבי של TensorFlow Lite בעזרת Bazel

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

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

תוכלו ליצור את המכשירים AAR מותאמים אישית של TensorFlow Lite באמצעות מתן נתיבים של קובצי המודל שלכם לפי השלבים הבאים.

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 לפעולות מובנות של TensorFlow Lite ולפעולות מותאמות אישית של TensorFlow, ובאופן אופציונלי, היא תיצור את קובץ ה-AAR bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar אם המודלים שלכם מכילים פעולות Select TensorFlow. שימו לב שהפעולה הזו יוצרת AAR "מלא" עם מספר ארכיטקטורות שונות. אם אין צורך בכולן, אפשר להשתמש בקבוצת המשנה שמתאימה לסביבת הפריסה.

פיתוח באמצעות פעולות מותאמות אישית

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

פיתוח סלקטיבי של TensorFlow Lite באמצעות Docker

הקטע הזה מניח שהתקנת את Docker במחשב המקומי והורדתם את קובץ ה-Docker של TensorFlow Lite כאן.

אחרי שמורידים את קובץ ה-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

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

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 בשביל פעולות מובנות ומותאמות אישית של TensorFlow Lite, ויכול להיות את קובץ ה-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

בחלק Buildinglocal (פיתוח מקומי) תוכלו לקרוא איך מגדירים את סביבת ה-build ואת סביבת העבודה של TensorFlow, ואז פועלים לפי המדריך לשימוש בסקריפט הסלקטיב של build ל-iOS.