Сборка TensorFlow Lite для iOS

В этом документе описывается, как самостоятельно собрать библиотеку TensorFlow Lite для iOS. Обычно вам не нужно локально собирать библиотеку TensorFlow Lite для iOS. Если вы просто хотите его использовать, самый простой способ — использовать готовые стабильные или ночные выпуски TensorFlow Lite CocoaPods. Дополнительные сведения о том, как использовать их в проектах iOS, см. в кратком руководстве по iOS .

Создание локально

В некоторых случаях вам может потребоваться использовать локальную сборку TensorFlow Lite, например, если вы хотите внести локальные изменения в TensorFlow Lite и протестировать эти изменения в своем приложении iOS, или вы предпочитаете использовать статическую платформу вместо предоставленной нами динамической. Чтобы создать универсальную платформу iOS для TensorFlow Lite локально, вам необходимо собрать ее с помощью 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

Для TensorFlow Lite существует три CocoaPod:

  • TensorFlowLiteSwift : предоставляет API-интерфейсы Swift для TensorFlow Lite.
  • TensorFlowLiteObjC : предоставляет API-интерфейсы Objective-C для TensorFlow Lite.
  • TensorFlowLiteC : общий базовый модуль, который включает в себя основную среду выполнения TensorFlow Lite и предоставляет базовые API-интерфейсы C, используемые двумя вышеупомянутыми модулями. Не предназначен для непосредственного использования пользователями.

Как разработчик, вы должны выбрать модуль TensorFlowLiteSwift или TensorFlowLiteObjC в зависимости от языка, на котором написано ваше приложение, но не оба сразу. Точные шаги по использованию локальных сборок TensorFlow Lite различаются в зависимости от того, какую именно часть вы хотите собрать.

Использование локальных API Swift или Objective-C.

Если вы используете CocoaPods и хотите протестировать только некоторые локальные изменения в API-интерфейсах Swift или Objective-C TensorFlow Lite, выполните следующие действия.

  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 и использовать эту версию (см. раздел «Использование локального ядра TensorFlow Lite» ниже).

  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.

Использование локального ядра TensorFlow Lite

Вы можете настроить частный репозиторий спецификаций 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",
  ],
)

Когда вы создаете проект приложения, любые изменения в библиотеке TensorFlow Lite будут подхвачены и встроены в ваше приложение.

Измените настройки проекта Xcode напрямую

Настоятельно рекомендуется использовать CocoaPods или Bazel для добавления зависимости TensorFlow Lite в ваш проект. Если вы по-прежнему хотите добавить платформу TensorFlowLiteC вручную, вам необходимо добавить платформу TensorFlowLiteC в качестве встроенной платформы в проект вашего приложения. Разархивируйте TensorFlowLiteC_framework.zip , созданный из приведенной выше сборки, чтобы получить каталог TensorFlowLiteC.framework . Этот каталог представляет собой фактическую структуру, которую может понять Xcode.

После того, как вы подготовили TensorFlowLiteC.framework , сначала вам нужно добавить его как встроенный двоичный файл в цель вашего приложения. Точный раздел настроек проекта для этого может отличаться в зависимости от вашей версии Xcode.

  • Xcode 11: перейдите на вкладку «Общие» редактора проекта для целевого приложения и добавьте TensorFlowLiteC.framework в раздел «Рамки, библиотеки и встроенный контент».
  • Xcode 10 и ниже: перейдите на вкладку «Общие» редактора проекта для целевого приложения и добавьте TensorFlowLiteC.framework в раздел «Встроенные двоичные файлы». Платформу также следует добавить автоматически в раздел «Связанные платформы и библиотеки».

Когда вы добавляете фреймворк в виде встроенного двоичного файла, Xcode также обновит запись «Пути поиска фреймворка» на вкладке «Настройки сборки», включив в него родительский каталог вашей фреймворка. Если этого не происходит автоматически, вам следует вручную добавить родительский каталог каталога TensorFlowLiteC.framework .

Как только эти две настройки будут выполнены, вы сможете импортировать и вызывать API C TensorFlow Lite, определенный файлами заголовков в каталоге TensorFlowLiteC.framework/Headers .