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