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

Обзор

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

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

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

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

Название модели Домен Целевая архитектура Размер(ы) файла AAR
Mobilenet_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-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 если ваши модели содержат операции 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 и вы хотите определить пользовательские зависимости 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 на своем локальном компьютере и загрузили 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.