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