تقليل الحجم الثنائي لـ 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 بايت)
التوابل استخراج درجة الصوت 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 إذا كانت نماذجك تحتوي على حدد عمليات TensorFlow. لاحظ أن هذا يؤدي إلى بناء "دهون" ميزة "التطبيق التلقائي للاقتراحات" بعدّة لغات الهياكل الهندسية إذا لم تكن بحاجة إليها جميعًا، فاستخدم المجموعة الفرعية المناسبة بيئة النشر لديك.

البناء باستخدام العمليات المخصّصة

إذا كنت قد طورت نماذج 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",
    ],
)

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

إذا أردت إنشاء عنصر مشترك مخصّص في 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

بالنسبة للنماذج التي تحتوي على عمليات تحديد 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

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

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

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