تقليل الحجم الثنائي لـ LiteRT

نظرة عامة

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

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

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

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

اسم النموذج النطاق البنية المستهدَفة أحجام ملفات 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 وأعددت بيئة التطوير المحلية في Bazel.

إنشاء ملفات AAR لمشروع Android

يمكنك إنشاء ملفات AAR مخصّصة من LiteRT من خلال تقديم مسارات ملفات النموذج على النحو التالي.

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 بشكل اختياري إذا كانت نماذجك تتضمّن عمليات Select TensorFlow. يُرجى العِلم أنّ هذا الإجراء ينشئ ملف AAR "ضخمًا" يتضمّن عدة بنى مختلفة. وإذا لم تكن بحاجة إلى كل هذه البنى، استخدِم المجموعة الفرعية المناسبة لبيئة النشر.

إنشاء عمليات مخصّصة

إذا كنت قد طوّرت نماذج LiteRT باستخدام عمليات مخصّصة، يمكنك إنشاء هذه النماذج من خلال إضافة العلامات التالية إلى أمر الإنشاء:

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:

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++

إذا أردت إنشاء عناصر مشتركة مخصّصة بلغة C/C++ في TFLite للنماذج المحدّدة، يمكنك اتّباع الخطوات التالية:

أنشئ ملف BUILD مؤقتًا من خلال تنفيذ الأمر التالي في الدليل الجذر لرمز مصدر TensorFlow:

mkdir -p tmp && touch tmp/BUILD

إنشاء عناصر C مشتركة مخصّصة

إذا أردت إنشاء عنصر مشترك مخصّص بلغة C في TFLite، أضِف ما يلي إلى ملف 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

بالنسبة إلى النماذج التي تتضمّن عمليات 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

إنشاء LiteRT بشكل انتقائي باستخدام Docker

يفترض هذا القسم أنّك ثبّت Docker على جهازك المحلّي ونزّلت ملف LiteRT 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

بعد ذلك، يمكنك إنشاء حزمة AAR مخصّصة من LiteRT من خلال تقديم مسارات ملفات النموذج على النحو التالي.

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 لعمليات Select TensorFlow في دليلك الحالي.

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

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

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

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

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