סקירה כללית
במהלך פריסת מודלים לאפליקציות של למידת מכונה (ODML) במכשיר, חשוב חשוב להיות מודעים לזיכרון המוגבל שזמין במכשירים ניידים. הגדלים הבינאריים של המודלים קשורים באופן הדוק למספר הפעולות שנעשה בהן שימוש מודל טרנספורמר. תכונת LiteRT מאפשרת לכם להקטין את הגדלים הבינאריים של המודל באמצעות פיתוחים סלקטיביים. גרסאות build סלקטיביות מדלגות על פעולות שלא נמצאות בשימוש בקבוצת המודלים שלך היא יוצרת ספרייה קומפקטית עם סביבת זמן הריצה ו הליבה של התפעול שנדרשים את המודל שצריך לפעול במכשיר הנייד שלך.
גרסת ה-build הסלקטיבית חלה על שלוש ספריות הפעולות הבאות.
בטבלה הבאה אפשר לראות את ההשפעה של גרסאות 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 בייטים) |
פיתוח סלקטיבי של LiteRT באמצעות Bazel
הקטע הזה מניח שהורדתם קודי מקור של TensorFlow והגדרתם את הפיתוח המקומי בסביבה כדי בז.
פיתוח קובצי AAR לפרויקט Android
כדי ליצור מכשירים מותאמים אישית של LiteRT AAR, אפשר לספק את הנתיבים של קובצי המודלים כמפורט בהמשך.
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
אם המודלים מכילים
בוחרים פעולות של 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 זמני, מריצים את הפקודה הבאה ברמה הבסיסית (root) של קוד המקור של 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++
אם רוצים ליצור אובייקט משותף מותאם אישית מסוג 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
פיתוח סלקטיבי של LiteRT באמצעות Docker
קטע זה מבוסס על ההנחה שהתקנתם Docker במחשב המקומי ו הורדת את קובץ LiteRT Docker כאן.
לאחר הורדת קובץ ה-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
לאחר מכן אפשר ליצור את ה-LiteRT 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
הוא שמירה, הסתעפות או תג של המאגר של 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 של tensorflow-lite-select-tf-ops.aar
בתור
אם יוצרים אותו.
פיתוח סלקטיבי ל-iOS
יש לעיין בקטע בנייה מקומית כדי להגדיר את סביבת ה-build ולהגדיר את סביבת העבודה של TensorFlow, ואז לפעול לפי המדריך לשימוש סקריפט של build ל-iOS.