סקירה כללית
כשפורסים מודלים לאפליקציות של למידת מכונה במכשיר (ODML), חשוב להיות מודעים לזיכרון המוגבל שזמין במכשירים ניידים. גודלי הקבצים הבינאריים של המודלים קשורים באופן הדוק למספר הפעולות שנעשה בהן שימוש במודל. LiteRT מאפשר לצמצם את הגודל של קובצי הבינארי של המודל באמצעות בנייה סלקטיבית. בבנייה סלקטיבית, המערכת מדלגת על פעולות שלא נעשה בהן שימוש בקבוצת המודלים, ומפיקה ספרייה קומפקטית שכוללת רק את זמן הריצה ואת ליבות הפעולות שנדרשות כדי שהמודל יפעל במכשיר הנייד.
הידור סלקטיבי חל על שלוש ספריות הפעולות הבאות.
בטבלה הבאה מוצגת ההשפעה של בנייה סלקטיבית בכמה תרחישי שימוש נפוצים:
| שם דגם | דומיין | ארכיטקטורת היעד | גודל קובץ ה-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.