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

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

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

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

Преобразование модели

В следующем примере показано, как создать модель TensorFlow Lite с выбранными операциями 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 TensorFlow Lite ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

Запустить вывод

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

Android AAR

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

Вы можете указать это в своих зависимостях build.gradle , добавив его вместе со стандартным TensorFlow Lite 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 графа должен быть автоматически установлен для графов, которым они требуются.

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

Создание Android AAR

Для уменьшения размера двоичного файла или других сложных случаев вы также можете собрать библиотеку вручную. Предполагая рабочую среду сборки TensorFlow Lite , создайте 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 для встроенных и пользовательских операций TensorFlow Lite; и создайте файл 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() и замените стандартную зависимость TensorFlow Lite той, которая поддерживает некоторые операции 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

TensorFlow Lite предоставляет готовые ночные CocoaPods для операций TF для arm64 , на которые вы можете положиться вместе с CocoaPods TensorFlowLiteSwift или TensorFlowLiteObjC .

# 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-приложение Image Classification, чтобы протестировать функцию select TF ops.

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

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

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

После того, как вы настроили рабочую область с включенной поддержкой iOS, вы можете использовать следующую команду для создания выбранной инфраструктуры надстроек TF ops, которую можно добавить поверх обычной 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 ops. В вашем проекте Xcode перейдите в Build Settings -> Other Linker Flags и добавьте:

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

С/С++

Если вы используете Bazel или CMake для создания интерпретатора TensorFlow Lite, вы можете включить делегата Flex, связав общую библиотеку делегатов TensorFlow Lite 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 будет установлен автоматически при создании интерпретатора во время выполнения, если общая библиотека подключена. Нет необходимости явно устанавливать экземпляр делегата, как это обычно требуется для других типов делегатов.

Питон

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

Метрики

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

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

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

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

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

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

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

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

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

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

Обновления

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