Поскольку встроенная библиотека операторов 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 с операторами 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 относительно велика, поэтому вы, вероятно, захотите отфильтровать ненужные ABI x86 в файле .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 ops 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
LiteRT с выбранными операциями 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 для создания интерпретатора 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 . Вы также можете выбрать установку только пакета LiteRT Interpreter pip .
Метрики
Производительность
При использовании комбинации как встроенных, так и выбранных операций 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++ | Размер APK-файла Android |
---|---|---|
Только встроенные операторы | 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
- Улучшена совместимость с делегатами с аппаратным ускорением.