Выберите операторы 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 с операторами TensorFlow, размещенными в MavenCentral .

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

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 предоставляет ежевечерние предварительно созданные выбранные TF ops CocoaPods для arm64 , на которые вы можете положиться наряду с TensorFlowLiteSwift или TensorFlowLiteObjC CocoaPods.

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

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

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

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

После того, как вы настроили рабочую область с включенной поддержкой iOS, вы можете использовать следующую команду для создания платформы дополнений select 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. В проекте 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 .

Строить Двоичный размер C++ Размер 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
    • Улучшена совместимость с делегатами с аппаратным ускорением.