اندازه باینری TensorFlow Lite را کاهش دهید

بررسی اجمالی

هنگام استقرار مدل‌ها برای برنامه‌های یادگیری ماشین روی دستگاه (ODML)، مهم است که از حافظه محدود موجود در دستگاه‌های تلفن همراه آگاه باشید. اندازه های باینری مدل ارتباط نزدیکی با تعداد عملیات استفاده شده در مدل دارد. TensorFlow Lite شما را قادر می سازد تا اندازه های باینری مدل را با استفاده از ساخت های انتخابی کاهش دهید. بیلدهای انتخابی از عملیات استفاده نشده در مجموعه مدل شما صرفنظر می کنند و یک کتابخانه جمع و جور با زمان اجرا و هسته های عملیات مورد نیاز برای اجرای مدل در دستگاه تلفن همراه شما تولید می کنند.

ساخت انتخابی بر روی سه کتابخانه عملیات زیر اعمال می شود.

  1. کتابخانه عملیات داخلی TensorFlow Lite
  2. عملیات سفارشی TensorFlow Lite
  3. کتابخانه TensorFlow ops را انتخاب کنید

جدول زیر تأثیر ساخت‌های انتخابی را برای برخی موارد استفاده رایج نشان می‌دهد:

نام مدل دامنه معماری هدف اندازه فایل 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 برای پروژه اندروید

شما می توانید با ارائه مسیرهای فایل مدل خود به شرح زیر، 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

دستور بالا فایل 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",
    ],
)

برای مدل‌های دارای گزینه 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++ خود را برای مدل های داده شده بسازید، می توانید مراحل زیر را دنبال کنید:

با اجرای دستور زیر در پوشه اصلی کد منبع TensorFlow، یک فایل BUILD موقت ایجاد کنید:

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

و برای اندروید (برای 64 بیت android_arm با android_arm64 جایگزین کنید):

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

و برای اندروید (برای 64 بیت android_arm با android_arm64 جایگزین کنید):

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

و برای اندروید (برای 64 بیت android_arm با android_arm64 جایگزین کنید):

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 برای پروژه اندروید

اسکریپت ساخت با داکر را با اجرای زیر دانلود کنید:

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 یک commit، یک شاخه یا یک برچسب از مخزن TensorFlow است که می‌خواهید قبل از ساخت کتابخانه‌ها آن را بررسی کنید. به طور پیش فرض آخرین شعبه انتشار است. دستور بالا فایل 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 به بخش Building locally مراجعه کنید و سپس راهنمای استفاده از اسکریپت ساخت انتخابی برای iOS را دنبال کنید.