ملخص
عند نشر نماذج لتطبيقات التعلم الآلي (ODML) على الجهاز ، من المهم أن تكون على دراية بالذاكرة المحدودة المتوفرة على الأجهزة المحمولة. ترتبط الأحجام الثنائية النموذجية ارتباطًا وثيقًا بعدد العمليات المستخدمة في النموذج. يمكّنك TensorFlow Lite من تقليل الأحجام الثنائية للنموذج باستخدام عمليات إنشاء انتقائية. تتخطى الإنشاءات الانتقائية العمليات غير المستخدمة في مجموعة النماذج الخاصة بك وتنتج مكتبة مضغوطة بوقت التشغيل ونواة المرجع المطلوبة للنموذج ليتم تشغيله على جهازك المحمول.
ينطبق البناء الانتقائي على مكتبات العمليات الثلاث التالية.
يوضح الجدول أدناه تأثير الإصدارات الانتقائية لبعض حالات الاستخدام الشائعة:
اسم النموذج | اِختِصاص | الهدف العمارة | حجم (أحجام) ملف 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 لمشروع Android
يمكنك إنشاء TensorFlow Lite AARs المخصصة من خلال توفير مسارات ملفات النموذج الخاص بك على النحو التالي.
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. لاحظ أن هذا يبني 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 \
--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",
],
)
للنماذج ذات عمليات تحديد 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
بالنسبة للنماذج التي تحتوي على عمليات تحديد 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_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 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
بعد ذلك ، يمكنك إنشاء 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
هي التزام أو فرع أو علامة من TensorFlow repo التي تريد سحبها قبل إنشاء المكتبات ؛ بشكل افتراضي هو أحدث فرع إصدار. سيقوم الأمر أعلاه بإنشاء ملف 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.