Поскольку встроенная библиотека операторов 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
- Улучшена совместимость с делегатами с аппаратным ускорением.