Помогают защитить Большой Барьерный Риф с TensorFlow на Kaggle Присоединяйтесь вызов

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

Обзор

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

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

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

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

Наименование модели Домен Целевая архитектура Размер файла (ов) AAR
Mobilenet_1.0_224 (плавающий) Классификация изображений armeabi-v7a tenorflow-lite.aar (296635 байт)
arm64-v8a tenorflow-lite.aar (382 892 байта)
СПЕЦИЯ Извлечение высоты звука armeabi-v7a tensorflow-lite.aar (375 813 байт)
tenorflow-lite-select-tf-ops.aar (1,676,380 байт)
arm64-v8a tenorflow-lite.aar (421 826 байт)
tenorflow-lite-select-tf-ops.aar (2298630 байт)
i3d-кинетика-400 Классификация видео armeabi-v7a tenorflow-lite.aar (240 085 байт)
tenorflow-lite-select-tf-ops.aar (1708597 байт)
arm64-v8a tensorflow-lite.aar (273 713 байт)
tenorflow-lite-select-tf-ops.aar (2339697 байт)

Известные проблемы / ограничения

  1. Выборочная сборка для C API и версии iOS в настоящее время не поддерживается.

Выборочная сборка TensorFlow Lite с помощью Bazel

В этом разделе предполагается , что вы загрузили исходные коды TensorFlow и настроить локальную среду разработки в Базель.

Сборка файлов 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 встроенные и пользовательские ОПС; и , возможно, генерирует AAR файл bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar , если ваши модели содержат Выберите 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",
    ],
)

Для моделей с ОПС Выбор 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++14 \
  //tmp:tensorflowlite_c

и для Android (заменить android_arm с android_arm64 для 64-бит):

bazel build -c opt --cxxopt=--std=c++14 --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++14 \
  //tmp:tensorflowlite

и для Android (заменить android_arm с android_arm64 для 64-бит):

bazel build -c opt --cxxopt=--std=c++14 --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++14' \
      --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++14' \
      --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 для проекта 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 в свой проект , либо путем публикации пользовательского AAR на локальное хранилище Maven . Обратите внимание , что вы должны добавить файлы AAR для tensorflow-lite-select-tf-ops.aar , а если вы его генерации.