В этом документе описывается, как самостоятельно собрать библиотеку LiteRT iOS. Обычно вам не нужно локально собирать библиотеку LiteRT iOS. Если вы просто хотите его использовать, самый простой способ — использовать готовые стабильные или ночные выпуски LiteRT CocoaPods. Дополнительные сведения о том, как использовать их в проектах iOS, см. в кратком руководстве по iOS .
Создание локально
В некоторых случаях вам может потребоваться использовать локальную сборку LiteRT, например, если вы хотите внести локальные изменения в LiteRT и протестировать эти изменения в своем приложении iOS или предпочитаете использовать статическую платформу вместо предоставленной нами динамической. Чтобы создать универсальную платформу iOS для LiteRT локально, вам необходимо собрать ее с помощью Bazel на компьютере с macOS.
Установить Xcode
Если вы еще этого не сделали, вам потребуется установить Xcode 8 или новее и инструменты, использующие xcode-select
:
xcode-select --install
Если это новая установка, вам необходимо будет принять лицензионное соглашение для всех пользователей с помощью следующей команды:
sudo xcodebuild -license accept
Установить Базель
Bazel — это основная система сборки TensorFlow. Установите Bazel согласно инструкции на сайте Bazel . Обязательно выберите версию между _TF_MIN_BAZEL_VERSION
и _TF_MAX_BAZEL_VERSION
в файле configure.py
в корне репозитория tensorflow
.
Настройте WORKSPACE и .bazelrc
Запустите сценарий ./configure
в корневом каталоге проверки TensorFlow и ответьте «Да», когда сценарий спросит, хотите ли вы собрать TensorFlow с поддержкой iOS.
Создайте динамическую структуру TensorFlowLiteC (рекомендуется)
Как только Bazel будет правильно настроен для поддержки iOS, вы сможете создать платформу TensorFlowLiteC
с помощью следующей команды.
bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
//tensorflow/lite/ios:TensorFlowLiteC_framework
Эта команда создаст файл TensorFlowLiteC_framework.zip
в каталоге bazel-bin/tensorflow/lite/ios/
в корневом каталоге TensorFlow. По умолчанию сгенерированная платформа содержит «толстый» двоичный файл, содержащий Armv7, Arm64 и x86_64 (но не i386). Чтобы просмотреть полный список флагов сборки, используемых при указании --config=ios_fat
, обратитесь к разделу конфигураций iOS в файле .bazelrc
.
Создайте статическую структуру TensorFlowLiteC.
По умолчанию мы распространяем динамическую структуру только через Cocoapods. Если вы хотите вместо этого использовать статическую структуру, вы можете создать статическую структуру TensorFlowLiteC
с помощью следующей команды:
bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
//tensorflow/lite/ios:TensorFlowLiteC_static_framework
Команда создаст файл с именем TensorFlowLiteC_static_framework.zip
в каталоге bazel-bin/tensorflow/lite/ios/
в корневом каталоге TensorFlow. Эту статическую структуру можно использовать точно так же, как и динамическую.
Выборочное создание фреймворков TFLite
Вы можете создавать меньшие платформы, ориентированные только на набор моделей, используя выборочную сборку, которая будет пропускать неиспользуемые операции в вашем наборе моделей и включать только те ядра операций, которые необходимы для запуска данного набора моделей. Команда следующая:
bash tensorflow/lite/ios/build_frameworks.sh \
--input_models=model1.tflite,model2.tflite \
--target_archs=x86_64,armv7,arm64
Приведенная выше команда сгенерирует статическую структуру bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip
для встроенных и пользовательских операций TensorFlow Lite; и, при необходимости, генерирует статическую платформу bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip
если ваши модели содержат операции Select TensorFlow. Обратите внимание, что флаг --target_archs
можно использовать для указания архитектуры развертывания.
Используйте в своем приложении
Разработчики CocoaPods
Для LiteRT существует три CocoaPods:
-
TensorFlowLiteSwift
: предоставляет API-интерфейсы Swift для LiteRT. -
TensorFlowLiteObjC
: предоставляет API-интерфейсы Objective-C для LiteRT. -
TensorFlowLiteC
: общий базовый модуль, который включает в себя основную среду выполнения LiteRT и предоставляет базовые API-интерфейсы C, используемые двумя вышеупомянутыми модулями. Не предназначен для непосредственного использования пользователями.
Как разработчик, вам следует выбрать модуль TensorFlowLiteSwift
или TensorFlowLiteObjC
в зависимости от языка, на котором написано ваше приложение, но не оба одновременно. Точные шаги по использованию локальных сборок LiteRT различаются в зависимости от того, какую именно часть вы хотите собрать.
Использование локальных API Swift или Objective-C.
Если вы используете CocoaPods и хотите протестировать только некоторые локальные изменения в API-интерфейсах Swift или Objective-C LiteRT, выполните следующие действия.
Внесите изменения в API Swift или Objective-C при проверке
tensorflow
.Откройте файл
TensorFlowLite(Swift|ObjC).podspec
и обновите эту строку:
s.dependency 'TensorFlowLiteC', "#{s.version}"
быть:
s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
Это необходимо для того, чтобы вы создавали API Swift или Objective-C на основе последней доступной ночной версии APITensorFlowLiteC
(создаваемой каждую ночь с 1 до 4 утра по тихоокеанскому времени), а не на стабильной версии, которая может быть устаревшей по сравнению с вашим локальнымtensorflow
проверить. Альтернативно вы можете опубликовать свою собственную версиюTensorFlowLiteC
и использовать ее (см. раздел «Использование локального ядра LiteRT» ниже).В
Podfile
вашего проекта iOS измените зависимость следующим образом, чтобы указать локальный путь к корневому каталогу вашегоtensorflow
.
Для Свифта:
pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
Для Objective-C:
pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'
Обновите установку модуля из корневого каталога проекта iOS.
$ pod update
Снова откройте сгенерированную рабочую область (
<project>.xcworkspace
) и перестройте приложение в Xcode.
Использование локального ядра LiteRT
Вы можете настроить частный репозиторий спецификаций CocoaPods и опубликовать свою собственную платформу TensorFlowLiteC
в своем частном репозитории. Вы можете скопировать этот файл podspec и изменить несколько значений:
...
s.version = <your_desired_version_tag>
...
# Note the `///`, two from the `file://` and one from the `/path`.
s.source = { :http => "file:///path/to/TensorFlowLiteC_framework.zip" }
...
s.vendored_frameworks = 'TensorFlowLiteC.framework'
...
После создания собственного файла TensorFlowLiteC.podspec
вы можете следовать инструкциям по использованию частных CocoaPods, чтобы использовать его в своем собственном проекте. Вы также можете изменить TensorFlowLite(Swift|ObjC).podspec
чтобы он указывал на ваш собственный модуль TensorFlowLiteC
, и использовать модуль Swift или Objective-C в своем проекте приложения.
Разработчики Базела
Если вы используете Bazel в качестве основного инструмента сборки, вы можете просто добавить зависимость TensorFlowLite
к своей цели в файле BUILD
.
Для Свифта:
swift_library(
deps = [
"//tensorflow/lite/swift:TensorFlowLite",
],
)
Для Objective-C:
objc_library(
deps = [
"//tensorflow/lite/objc:TensorFlowLite",
],
)
Когда вы создаете проект приложения, любые изменения в библиотеке LiteRT будут подхвачены и встроены в ваше приложение.
Измените настройки проекта Xcode напрямую
Настоятельно рекомендуется использовать CocoaPods или Bazel для добавления зависимости LiteRT в ваш проект. Если вы по-прежнему хотите добавить платформу TensorFlowLiteC
вручную, вам необходимо добавить платформу TensorFlowLiteC
в качестве встроенной платформы в проект вашего приложения. Разархивируйте TensorFlowLiteC_framework.zip
, созданный из приведенной выше сборки, чтобы получить каталог TensorFlowLiteC.framework
. Этот каталог представляет собой фактическую структуру, которую может понять Xcode.
После того, как вы подготовили TensorFlowLiteC.framework
, сначала вам нужно добавить его как встроенный двоичный файл в цель вашего приложения. Точный раздел настроек проекта для этого может отличаться в зависимости от вашей версии Xcode.
- Xcode 11: перейдите на вкладку «Общие» редактора проекта для целевого приложения и добавьте
TensorFlowLiteC.framework
в раздел «Рамки, библиотеки и встроенный контент». - Xcode 10 и ниже: перейдите на вкладку «Общие» редактора проекта для целевого приложения и добавьте
TensorFlowLiteC.framework
в раздел «Встроенные двоичные файлы». Платформу также следует добавить автоматически в раздел «Связанные платформы и библиотеки».
Когда вы добавляете фреймворк в виде встроенного двоичного файла, Xcode также обновит запись «Пути поиска фреймворка» на вкладке «Настройки сборки», включив в него родительский каталог вашей фреймворка. Если этого не происходит автоматически, вам следует вручную добавить родительский каталог каталога TensorFlowLiteC.framework
.
Как только эти две настройки будут выполнены, вы сможете импортировать и вызывать C API LiteRT, определенный файлами заголовков в каталоге TensorFlowLiteC.framework/Headers
.