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

סקירה כללית

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

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

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

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

שם המודל תְחוּם ארכיטקטורת יעד גודל קובץ AAR
Mobilenet_1.0_224(צף) סיווג תמונה armeabi-v7a tensorflow-lite.aar (296,635 בתים)
arm64-v8a tensorflow-lite.aar (382,892 בתים)
לְתַבֵּל מיצוי גובה הצליל 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 עבור פרויקט אנדרואיד

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

שימושים מתקדמים: חוקי 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 :

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_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_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_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 במחשב המקומי שלך והורדת את ה-TensorFlow Lite Dockerfile כאן .

לאחר הורדת ה-Dockerfile לעיל, תוכל לבנות את תמונת ה-Docker על ידי הפעלת:

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

בניית קבצי AAR עבור פרויקט אנדרואיד

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

לאחר מכן, תוכל לבנות את TensorFlow Lite 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 הוא commit, סניף או תג של ה-Repo TensorFlow שברצונך לבצע בו לפני בניית הספריות; כברירת מחדל זהו ענף המהדורה האחרון. הפקודה שלעיל תיצור את קובץ ה-AAR tensorflow-lite.aar עבור TensorFlow Lite פעולות מובנות ומותאמות אישית, ובאופן אופציונלי את קובץ AAR tensorflow-lite-select-tf-ops.aar עבור Select TensorFlow ops בספרייה הנוכחית שלך.

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

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

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

בנייה סלקטיבית עבור iOS

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