Благодарим за настройку Google I/O. Посмотреть все сеансы по запросу Смотреть по запросу

Уменьшить размер бинарного файла 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

Вы можете создавать пользовательские 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; и, необязательно, создает файл 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++ для заданных моделей, вы можете выполнить следующие шаги:

Создайте временный файл 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 на свой локальный компьютер и загрузили файл Docker TensorFlow Lite здесь .

После загрузки вышеупомянутого 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

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

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

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