اندازه باینری LiteRT را کاهش دهید

نمای کلی

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

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

  1. کتابخانه عملیات داخلی LiteRT
  2. گزینه‌های سفارشی LiteRT
  3. کتابخانه عملیات TensorFlow را انتخاب کنید

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

نام مدل دامنه معماری هدف اندازه(های) فایل AAR
Mobilenet_1.0_224 (شناور) طبقه‌بندی تصویر armeabi-v7a tensorflow-lite.aar (۲۹۶,۶۳۵ بایت)
arm64-v8a tensorflow-lite.aar (۳۸۲,۸۹۲ بایت)
ادویه استخراج زیر و بمی صدا armeabi-v7a tensorflow-lite.aar (۳۷۵۸۱۳ بایت)
tensorflow-lite-select-tf-ops.aar (۱,۶۷۶,۳۸۰ بایت)
arm64-v8a tensorflow-lite.aar (۴۲۱۸۲۶ بایت)
tensorflow-lite-select-tf-ops.aar (۲,۲۹۸,۶۳۰ بایت)
i3d-سینتیک-400 طبقه‌بندی ویدیو armeabi-v7a tensorflow-lite.aar (۲۴۰,۰۸۵ بایت)
tensorflow-lite-select-tf-ops.aar (۱,۷۰۸,۵۹۷ بایت)
arm64-v8a tensorflow-lite.aar (۲۷۳،۷۱۳ بایت)
tensorflow-lite-select-tf-ops.aar (۲,۳۳۹,۶۹۷ بایت)

ساخت انتخابی LiteRT با Bazel

این بخش فرض می‌کند که شما کدهای منبع TensorFlow را دانلود کرده و محیط توسعه محلی Bazel را راه‌اندازی کرده‌اید .

ساخت فایل‌های AAR برای پروژه اندروید

شما می‌توانید با ارائه مسیرهای فایل مدل خود به شرح زیر، LiteRT 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 را برای عملیات داخلی و سفارشی LiteRT تولید می‌کند؛ و در صورت تمایل، اگر مدل‌های شما حاوی عملیات Select TensorFlow باشند، فایل aar bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar را نیز تولید می‌کند. توجه داشته باشید که این دستور یک AAR "بزرگ" با چندین معماری مختلف می‌سازد؛ اگر به همه آنها نیاز ندارید، از زیرمجموعه مناسب برای محیط استقرار خود استفاده کنید.

با گزینه‌های سفارشی بسازید

اگر مدل‌های LiteRT را با گزینه‌های سفارشی توسعه داده‌اید، می‌توانید با اضافه کردن پرچم‌های زیر به دستور build، آنها را بسازید:

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

و برای اندروید (برای نسخه ۶۴ بیتی، android_arm با android_arm64 جایگزین کنید):

bazel build -c opt --cxxopt=--std=c++17 --config=android_arm \
  //tmp:tensorflowlite

برای مدل‌هایی که از Select TF ops استفاده می‌کنند، باید کتابخانه مشترک زیر را نیز بسازید:

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

ساخت انتخابی LiteRT با Docker

این بخش فرض می‌کند که شما Docker را روی دستگاه محلی خود نصب کرده‌اید و فایل LiteRT Dockerfile را از اینجا دانلود کرده‌اید.

پس از دانلود فایل داکر بالا، می‌توانید با اجرای دستور زیر، ایمیج داکر را بسازید:

docker build . -t tflite-builder -f tflite-android.Dockerfile

ساخت فایل‌های AAR برای پروژه اندروید

اسکریپت ساخت با 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 به پروژه خود یا با انتشار AAR سفارشی در مخزن محلی Maven خود اضافه کنید. توجه داشته باشید که اگر tensorflow-lite-select-tf-ops.aar را ایجاد می‌کنید، باید فایل‌های AAR مربوط به آن را نیز اضافه کنید.

ساخت انتخابی برای iOS

لطفاً برای راه‌اندازی محیط ساخت و پیکربندی فضای کاری TensorFlow به بخش «ساخت محلی» مراجعه کنید و سپس برای استفاده از اسکریپت ساخت انتخابی برای iOS، راهنما را دنبال کنید.