Выберите операторы TensorFlow

Поскольку встроенная библиотека операторов LiteRT поддерживает лишь ограниченное количество операторов TensorFlow, не все модели можно преобразовать. Подробнее см. в разделе о совместимости операторов .

Чтобы разрешить преобразование, пользователи могут включить использование определённых операций TensorFlow в своей модели LiteRT. Однако запуск моделей LiteRT с операциями TensorFlow требует подключения ядра среды выполнения TensorFlow, что увеличивает размер двоичного файла интерпретатора LiteRT. В Android этого можно избежать, выборочно собирая только необходимые операции TensorFlow. Подробнее см. в разделе « Уменьшение размера двоичного файла» .

В этом документе описывается, как преобразовать и запустить модель LiteRT, содержащую операции TensorFlow, на любой платформе по вашему выбору. Также обсуждаются показатели производительности и размера , а также известные ограничения .

Преобразовать модель

В следующем примере показано, как создать модель LiteRT с использованием выбранных операций TensorFlow.

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.target_spec.supported_ops = [
  tf.lite.OpsSet.TFLITE_BUILTINS, # enable LiteRT ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

Выполнить вывод

При использовании модели LiteRT, преобразованной с поддержкой выбранных операций TensorFlow, клиент также должен использовать среду выполнения LiteRT, включающую необходимую библиотеку операций TensorFlow.

Android AAR

Чтобы уменьшить размер двоичного файла, создайте собственные AAR-файлы, следуя инструкциям в следующем разделе . Если размер двоичного файла не имеет значения, рекомендуем использовать готовый AAR-файл с операциями TensorFlow, размещённый на MavenCentral .

Вы можете указать это в зависимостях build.gradle , добавив его вместе со стандартным LiteRT AAR следующим образом:

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    // This dependency adds the necessary TF op support.
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly-SNAPSHOT'
}

Чтобы использовать ночные снимки, убедитесь, что вы добавили репозиторий снимков Sonatype .

После добавления зависимости необходимый делегат для обработки операций TensorFlow графа должен быть автоматически установлен для графов, которым он необходим.

Примечание : зависимость операций TensorFlow относительно велика, поэтому вы, вероятно, захотите отфильтровать ненужные x86 ABI в вашем файле .gradle , настроив abiFilters .

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

Создание Android AAR

Для уменьшения размера двоичного файла или в других сложных случаях вы также можете собрать библиотеку вручную. Если у вас есть рабочая среда сборки LiteRT , соберите Android AAR с выбранными операциями TensorFlow следующим образом:

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 для операций TensorFlow. Если у вас нет рабочей среды сборки, вы также можете собрать указанные выше файлы с помощью docker .

Отсюда вы можете либо импортировать файлы AAR непосредственно в свой проект, либо опубликовать пользовательские файлы AAR в локальном репозитории Maven:

mvn install:install-file \
  -Dfile=bazel-bin/tmp/tensorflow-lite.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite -Dversion=0.1.100 -Dpackaging=aar
mvn install:install-file \
  -Dfile=bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite-select-tf-ops -Dversion=0.1.100 -Dpackaging=aar

Наконец, в build.gradle вашего приложения убедитесь, что у вас есть зависимость mavenLocal() , и замените стандартную зависимость LiteRT на ту, которая поддерживает выбранные операции TensorFlow:

allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        mavenLocal()
    }
}

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.1.100'
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.1.100'
}

iOS

Использование CocoaPods

LiteRT предоставляет еженощно готовые избранные операции TF CocoaPods для arm64 , на которые вы можете положиться наряду с TensorFlowLiteSwift или TensorFlowLiteObjC CocoaPods.

Примечание : если вам нужно использовать выборочные операции TF в симуляторе x86_64 , вы можете создать фреймворк выборочных операций самостоятельно. Подробнее см. в разделе «Использование Bazel + Xcode» .

# In your Podfile target:
  pod 'TensorFlowLiteSwift'   # or 'TensorFlowLiteObjC'
  pod 'TensorFlowLiteSelectTfOps', '~> 0.0.1-nightly'

После выполнения pod install необходимо указать дополнительный флаг компоновщика для принудительной загрузки выбранного фреймворка TF ops в ваш проект. В проекте Xcode перейдите в Build Settings -> Other Linker Flags и добавьте:

Для версий >= 2.9.0:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.xcframework/ios-arm64/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

Для версий < 2.9.0:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

После этого вы сможете запускать любые модели, преобразованные с помощью SELECT_TF_OPS в вашем приложении iOS. Например, вы можете изменить приложение «Классификация изображений» для iOS , чтобы протестировать функцию выбора операций TF.

  • Замените файл модели на файл, преобразованный с включенным SELECT_TF_OPS .
  • Добавьте зависимость TensorFlowLiteSelectTfOps в Podfile , как указано.
  • Добавьте дополнительный флаг компоновщика, как указано выше.
  • Запустите пример приложения и проверьте, правильно ли работает модель.

Использование Bazel + Xcode

LiteRT с выбранными операциями TensorFlow для iOS можно собрать с помощью Bazel. Сначала следуйте инструкциям по сборке iOS , чтобы правильно настроить рабочее пространство Bazel и файл .bazelrc .

После настройки рабочей области с поддержкой iOS вы можете использовать следующую команду для сборки фреймворка Select TF ops Addon, который можно добавить поверх обычного TensorFlowLiteC.framework . Обратите внимание, что фреймворк Select TF ops не может быть собран для архитектуры i386 , поэтому вам необходимо явно указать список целевых архитектур, исключая i386 .

bazel build -c opt --config=ios --ios_multi_cpus=arm64,x86_64 \
  //tensorflow/lite/ios:TensorFlowLiteSelectTfOps_framework

Это создаст фреймворк в каталоге bazel-bin/tensorflow/lite/ios/ . Вы можете добавить этот новый фреймворк в свой проект Xcode, выполнив действия, аналогичные описанным в разделе « Настройки проекта Xcode» руководства по сборке для iOS.

После добавления фреймворка в проект приложения необходимо указать дополнительный флаг компоновщика для принудительной загрузки выбранного фреймворка TF-операций. В проекте Xcode перейдите в Build Settings -> Other Linker Flags и добавьте:

-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>

С/С++

Если вы используете Bazel или CMake для сборки интерпретатора LiteRT, вы можете включить Flex-делегат, подключив общую библиотеку LiteRT Flex-делегат. Собрать его можно с помощью Bazel, выполнив следующую команду.

bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex

Эта команда генерирует следующую общую библиотеку в bazel-bin/tensorflow/lite/delegates/flex .

Платформа Название библиотеки
Линукс libtensorflowlite_flex.so
macOS libtensorflowlite_flex.dylib
Окна tensorflowlite_flex.dll

Обратите внимание, что необходимый TfLiteDelegate будет установлен автоматически при создании интерпретатора во время выполнения, если подключена общая библиотека. Нет необходимости явно устанавливать экземпляр делегата, как это обычно требуется для других типов делегатов.

Примечание: эта функция доступна начиная с версии 2.7.

Питон

LiteRT с выбранными операциями TensorFlow будет установлен автоматически вместе с pip-пакетом TensorFlow . Вы также можете установить только pip-пакет LiteRT Interpreter .

Метрики

Производительность

При использовании комбинации встроенных и избранных операций TensorFlow все оптимизации LiteRT и оптимизированные встроенные операции будут доступны и применимы с преобразованной моделью.

В следующей таблице описано среднее время, необходимое для выполнения инференса в MobileNet на Pixel 2. Указанное время является средним для 100 запусков. Эти целевые значения были созданы для Android с использованием флагов: --config=android_arm64 -c opt .

Строить Время (миллисекунды)
Только встроенные операции ( TFLITE_BUILTIN ) 260,7
Использование только операций TF ( SELECT_TF_OPS ) 264,5

Двоичный размер

В следующей таблице описан размер двоичного кода LiteRT для каждой сборки. Эти цели были собраны для Android с использованием --config=android_arm -c opt .

Строить Размер двоичного кода C++ Размер Android APK
Только встроенные операции 796 КБ 561 КБ
Встроенные операции + операции TF 23,0 МБ 8,0 МБ
Встроенные операции + операции TF (1) 4,1 МБ 1,8 МБ

(1) Эти библиотеки выборочно собраны для модели i3d-kinetics-400 с 8 встроенными операциями TFLite и 3 операциями Tensorflow. Подробнее см. в разделе «Уменьшение размера двоичного кода LiteRT» .

Известные ограничения

  • Неподдерживаемые типы: некоторые операции TensorFlow могут не поддерживать полный набор типов ввода/вывода, которые обычно доступны в TensorFlow.

Обновления

  • Версия 2.6
    • Улучшена поддержка операторов на основе атрибутов GraphDef и инициализации ресурсов HashTable.
  • Версия 2.5
  • Версия 2.4
    • Улучшена совместимость с делегатами с аппаратным ускорением.