Поскольку встроенная библиотека операторов 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 графа должен быть автоматически установлен для графов, которым они требуются.
Примечание . Зависимость операций TensorFlow относительно велика, поэтому вам, вероятно, захочется отфильтровать ненужные ABI x86 в вашем .gradle
файле, настроив abiFilters
.
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 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 Classification Image , чтобы протестировать выбранную функцию TF ops.
- Замените файл модели файлом, преобразованным с включенным
SELECT_TF_OPS
. - Добавьте зависимость
TensorFlowLiteSelectTfOps
вPodfile
согласно инструкциям. - Добавьте дополнительный флаг компоновщика, как указано выше.
- Запустите пример приложения и посмотрите, правильно ли работает модель.
Использование Базеля + Xcode
TensorFlow Lite с выбранными операциями TensorFlow для iOS можно создать с помощью Bazel. Сначала следуйте инструкциям по сборке iOS , чтобы правильно настроить рабочую область Bazel и файл .bazelrc
.
После того, как вы настроили рабочую область с включенной поддержкой iOS, вы можете использовать следующую команду для создания платформы надстроек select TF ops, которую можно добавить поверх обычного TensorFlowLiteC.framework
. Обратите внимание, что выбранная платформа 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
будет установлен автоматически при создании интерпретатора во время выполнения, если общая библиотека связана. Нет необходимости явно устанавливать экземпляр делегата, как это обычно требуется для других типов делегатов.
Примечание. Эта функция доступна начиная с версии 2.7.
Питон
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
- Улучшена совместимость с делегатами с аппаратным ускорением.