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

ملخص

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

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

  1. مكتبة العمليات المدمجة TensorFlow Lite
  2. العمليات المخصصة TensorFlow Lite
  3. حدد مكتبة العمليات TensorFlow

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

اسم النموذج اِختِصاص العمارة المستهدفة حجم (أحجام) ملف AAR
موبايل نت_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-حركية-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 ops. لاحظ أن هذا يبني 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",
    ],
)

بالنسبة للطرز ذات عمليات 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++

إذا كنت ترغب في إنشاء كائنات مشتركة 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 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 لعمليات Select TensorFlow في دليلك الحالي.

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

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

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

بناء انتقائي لنظام iOS

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