Уменьшить размер двоичного файла LiteRT

Обзор

При развертывании моделей для приложений машинного обучения (ODML) на устройстве важно помнить об ограниченности памяти, доступной на мобильных устройствах. Размер двоичного файла модели тесно коррелирует с количеством операций, используемых в модели. LiteRT позволяет уменьшать размеры двоичных файлов модели за счет выборочных сборок. Выборочные сборки пропускают неиспользуемые операции в вашем наборе моделей и создают компактную библиотеку, содержащую только среду выполнения и ядра операций, необходимые для запуска модели на вашем мобильном устройстве.

Выборочная сборка применяется к следующим трем библиотекам операций.

  1. Встроенная библиотека операций LiteRT
  2. Специальные операции LiteRT
  3. Выберите библиотеку операций TensorFlow.

В таблице ниже показано влияние выборочных сборок на некоторые распространенные случаи использования:

Название модели Домен Целевая архитектура Размер(ы) файла AAR
Mobilenet_1.0_224(с плавающей запятой) Классификация изображений армеаби-v7a tensorflow-lite.aar (296 635 байт)
рука64-v8a tensorflow-lite.aar (382 892 байта)
СПАЙС Извлечение высоты звука армеаби-v7a tensorflow-lite.aar (375 813 байт)
tensorflow-lite-select-tf-ops.aar (1 676 380 байт)
рука64-v8a tensorflow-lite.aar (421 826 байт)
tensorflow-lite-select-tf-ops.aar (2 298 630 байт)
i3d-кинетика-400 Классификация видео армеаби-v7a tensorflow-lite.aar (240 085 байт)
tensorflow-lite-select-tf-ops.aar (1 708 597 байт)
рука64-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++.

Если вы хотите создать свои собственные общие объекты 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

Для моделей с операциями 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 на свой локальный компьютер и загрузили Dockerfile LiteRT здесь .

После загрузки вышеуказанного 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 в свой проект или опубликовав собственный AAR в локальном репозитории Maven . Обратите внимание, что вам также необходимо добавить файлы AAR для tensorflow-lite-select-tf-ops.aar если вы его сгенерируете.

Выборочная сборка для iOS

См. раздел «Локальная сборка» , чтобы настроить среду сборки и рабочую область TensorFlow, а затем следуйте руководству по использованию сценария выборочной сборки для iOS.