تقليل الحجم الثنائي لتطبيق TensorFlow Lite

نظرة عامة

عند نشر نماذج لتطبيقات تعلُّم الآلة على الجهاز (ODML)، من المهم أن تكون على دراية بالذاكرة المحدودة المتاحة على الأجهزة الجوّالة. ترتبط الأحجام الثنائية للنموذج ارتباطًا وثيقًا بعدد العمليات المستخدمة في النموذج. تتيح لك TensorFlow Lite تقليل أحجام النماذج الثنائية باستخدام الإصدارات الانتقائية. تتخطى الإصدارات الانتقائية العمليات غير المستخدمة في مجموعة النماذج وتنشئ مكتبة صغيرة تتضمن وقت التشغيل ونواة العمليات المطلوبة لتشغيل النموذج على جهازك الجوّال.

ينطبق التصميم الانتقائي على مكتبات العمليات الثلاث التالية.

  1. مكتبة العمليات المضمّنة في TensorFlow Lite
  2. العمليات المخصَّصة في TensorFlow Lite
  3. اختيار مكتبة عمليات TensorFlow

يوضح الجدول التالي تأثير الإصدارات الانتقائية لبعض حالات الاستخدام الشائعة:

اسم النموذج النطاق بنية الاستهداف أحجام ملفات AAR
Mobilenet_1.0_224(float) تصنيف الصور 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 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 للعمليات المضمّنة والمخصَّصة في 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.

الاستخدامات المتقدّمة: قواعد 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 (استبدِل 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، عليك أيضًا إنشاء المكتبة المشتركة التالية:

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 على جهازك المحلي ونزّلت ملف TensorFlow Lite Dockerfile هنا.

بعد تنزيل ملف Dockerfile أعلاه، يمكنك إنشاء صورة 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

بعد ذلك، يمكنك إنشاء تطبيق 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 الذي تريد الاطّلاع عليه قبل إنشاء المكتبات، ويكون تلقائيًا أحدث فرع للإصدار. سينشئ الأمر أعلاه ملف AAR tensorflow-lite.aar للعمليات المضمّنة والمخصَّصة من TensorFlow Lite، ويمكنك اختياريًا إنشاء ملف AAR tensorflow-lite-select-tf-ops.aar لعمليات "اختيار TensorFlow" في الدليل الحالي.

تحدد--cache_dir دليل ذاكرة التخزين المؤقت. إذا لم يتم توفير هذا النص، سينشئ النص البرمجي دليلاً باسم "bazel-build-cache" ضمن دليل العمل الحالي للتخزين المؤقت.

إضافة ملفات AAR إلى المشروع

يمكنك إضافة ملفات AAR من خلال استيرادها مباشرةً إلى مشروعك أو من خلال نشرها في مستودع Maven المحلي. يُرجى العلم أنّه يجب إضافة ملفات AAR إلى tensorflow-lite-select-tf-ops.aar أيضًا في حال إنشائها.

الإصدار الانتقائي لنظام التشغيل iOS

يُرجى الاطّلاع على قسم "الإنشاء على الجهاز" لإعداد بيئة التصميم وإعداد مساحة عمل TensorFlow ثم اتّباع الدليل لاستخدام النص البرمجي الانتقائي لإنشاء نظام التشغيل iOS.