Сборка LiteRT для iOS

В этом документе описывается, как самостоятельно собрать библиотеку 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.

Как только 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, выполните следующие действия.

  1. Внесите изменения в API Swift или Objective-C при проверке tensorflow .

  2. Откройте файл TensorFlowLite(Swift|ObjC).podspec и обновите эту строку:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    быть:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    Это необходимо для того, чтобы вы создавали API Swift или Objective-C на основе последней доступной ночной версии API TensorFlowLiteC (создаваемой каждую ночь с 1 до 4 утра по тихоокеанскому времени), а не на стабильной версии, которая может быть устаревшей по сравнению с вашим локальным tensorflow проверить. Альтернативно вы можете опубликовать свою собственную версию TensorFlowLiteC и использовать ее (см. раздел «Использование локального ядра LiteRT» ниже).

  3. В Podfile вашего проекта iOS измените зависимость следующим образом, чтобы указать локальный путь к корневому каталогу вашего tensorflow .
    Для Свифта:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    Для Objective-C:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

  4. Обновите установку модуля из корневого каталога проекта iOS.
    $ pod update

  5. Снова откройте сгенерированную рабочую область ( <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 .