Créer LiteRT pour iOS

Ce document explique comment créer vous-même une bibliothèque iOS LiteRT. Normalement, vous n'avez pas besoin de compiler en local la bibliothèque iOS LiteRT. Si vous Si vous souhaitez l'utiliser, le plus simple est d'utiliser la version stable prédéfinie des CocoaPods LiteRT. Voir iOS de démarrage rapide pour savoir comment les utiliser sur vos projets.

Compiler localement

Dans certains cas, vous pouvez utiliser un build local de LiteRT, pour par exemple lorsque vous voulez apporter des modifications locales à LiteRT et les tester dans votre application iOS, ou si vous préférez utiliser une structure statique dynamique. Pour créer localement un framework iOS universel pour LiteRT, vous devez le compiler à l'aide de Bazel sur une machine macOS.

Installer Xcode

Si vous ne l'avez pas déjà fait, vous devez installer Xcode 8 ou une version ultérieure, ainsi que les outils avec xcode-select:

xcode-select --install

S'il s'agit d'une nouvelle installation, vous devrez accepter le contrat de licence pour tous les utilisateurs avec la commande suivante:

sudo xcodebuild -license accept

Installer Bazel

Bazel est le principal système de compilation de TensorFlow. Installez Bazel conformément à la disponibles sur le site Web de Bazel. Veillez à choisir un version comprise entre _TF_MIN_BAZEL_VERSION et _TF_MAX_BAZEL_VERSION dans fichier configure.py à la racine du dépôt tensorflow.

Configurer WORKSPACE et .bazelrc

Exécutez le script ./configure dans le répertoire de paiement racine de TensorFlow. réponds "Oui" lorsque le script vous demande si vous souhaitez compiler TensorFlow avec iOS de l'assistance.

Une fois Bazel correctement configuré avec la prise en charge iOS, vous pouvez compiler TensorFlowLiteC à l'aide de la commande suivante.

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_framework

Cette commande génère le fichier TensorFlowLiteC_framework.zip sous bazel-bin/tensorflow/lite/ios/ sous votre répertoire racine TensorFlow. Par défaut, le framework généré contient un "fat" contenant armv7, arm64 et x86_64 (mais pas i386). Pour afficher la liste complète des indicateurs de compilation utilisés lorsque spécifiez --config=ios_fat, reportez-vous à la section des configurations iOS dans Fichier .bazelrc.

Créer un framework statique TensorFlowLiteC

Par défaut, nous ne distribuons le framework dynamique que via CocoaPods. Si vous voulez Pour utiliser le framework statique à la place, vous pouvez créer l'instance statique TensorFlowLiteC à l'aide de la commande suivante:

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_static_framework

La commande génère un fichier nommé TensorFlowLiteC_static_framework.zip. dans le répertoire bazel-bin/tensorflow/lite/ios/ sous votre racine TensorFlow . Ce framework statique peut être utilisé exactement de la même manière que dynamique.

Créer de manière sélective des frameworks TFLite

Vous pouvez créer des frameworks plus petits ciblant uniquement un ensemble de modèles à l'aide de méthodes ce qui ignore les opérations inutilisées dans votre ensemble de modèles et n'inclut que le module noyaux op nécessaires à l'exécution de l'ensemble de modèles donné. La commande est la suivante:

bash tensorflow/lite/ios/build_frameworks.sh \
  --input_models=model1.tflite,model2.tflite \
  --target_archs=x86_64,armv7,arm64

La commande ci-dessus génère le framework statique bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip pour TensorFlow Opérations personnalisées et intégrées Lite ; et, éventuellement, génère le framework statique bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip si vos modèles contiennent des opérations TensorFlow. Notez que l'option --target_archs pour spécifier vos architectures de déploiement.

Utiliser dans votre propre application

Développeurs CocoaPods

Il existe trois CocoaPods pour LiteRT:

  • TensorFlowLiteSwift: fournit les API Swift pour LiteRT.
  • TensorFlowLiteObjC: fournit les API Objective-C pour LiteRT.
  • TensorFlowLiteC: pod de base commun, qui intègre le noyau LiteRT et expose les API C de base utilisées par les deux pods ci-dessus. Non destiné à être directement utilisés par les utilisateurs.

En tant que développeur, vous devez choisir TensorFlowLiteSwift ou TensorFlowLiteObjC en fonction du langage dans lequel votre application est écrite. pas les deux. Les étapes exactes pour utiliser les versions locales de LiteRT diffèrent, en fonction de la partie exacte que vous souhaitez construire.

Utiliser des API Swift ou Objective-C locales

Si vous utilisez CocoaPods et que vous ne souhaitez tester que certaines modifications locales apportées au les API Swift ou les API Objective-C de LiteRT, suivez la procédure décrite ici.

  1. Modifiez les API Swift ou Objective-C dans votre règlement tensorflow.

  2. Ouvrez le fichier TensorFlowLite(Swift|ObjC).podspec, puis mettez à jour cette ligne:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    doit être:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    Cela permet de s'assurer que vous créez vos API Swift ou Objective-C par rapport à la dernière version nocturne disponible des API TensorFlowLiteC (créées chaque nuit entre 1h et 4h (heure du Pacifique)) au lieu du , qui peut être obsolète par rapport à votre paiement local tensorflow. Vous pouvez aussi choisir de publier votre propre version TensorFlowLiteC et utilisez cette version (voir la section Utiliser LiteRT local Core ci-dessous).

  3. Dans le fichier Podfile de votre projet iOS, modifiez la dépendance comme suit : pointez vers le chemin d'accès local de votre répertoire racine tensorflow.
    En Swift:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    Pour Objective-C:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

  4. Mettez à jour votre installation de pod à partir du répertoire racine de votre projet iOS.
    $ pod update

  5. Rouvrez l'espace de travail généré (<project>.xcworkspace) et recréez votre dans Xcode.

Utiliser LiteRT Core local

Vous pouvez configurer un dépôt privé de spécifications CocoaPods et publier votre TensorFlowLiteC à votre dépôt privé. Vous pouvez copier ce podspec fichier et modifiez quelques valeurs:

  ...
  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'
  ...

Après avoir créé votre propre fichier TensorFlowLiteC.podspec, vous pouvez suivre le des instructions d'utilisation de CocoaPods privés afin de l'utiliser dans votre propre projet. Vous pouvez également modifier TensorFlowLite(Swift|ObjC).podspec pour pointer vers votre pod TensorFlowLiteC personnalisé et utiliser Swift ou Objective-C dans votre projet d'application.

Développeurs Bazel

Si vous utilisez Bazel comme outil de compilation principal, il vous suffit d'ajouter Dépendance TensorFlowLite à votre cible dans votre fichier BUILD.

Pour Swift:

swift_library(
  deps = [
      "//tensorflow/lite/swift:TensorFlowLite",
  ],
)

Pour Objective-C:

objc_library(
  deps = [
      "//tensorflow/lite/objc:TensorFlowLite",
  ],
)

Lorsque vous compilez votre projet d'application, toute modification apportée à la bibliothèque LiteRT être choisi et intégré à votre application.

Modifier directement les paramètres du projet Xcode

Nous vous recommandons vivement d'utiliser CocoaPods ou Bazel pour ajouter LiteRT. la dépendance dans votre projet. Si vous souhaitez toujours ajouter TensorFlowLiteC manuellement, vous devez ajouter le framework TensorFlowLiteC en tant que intégré à votre projet d'application. Décompressez le fichier TensorFlowLiteC_framework.zip généré à partir de la compilation ci-dessus pour obtenir TensorFlowLiteC.framework. Ce répertoire est le framework que Xcode peut comprendre.

Une fois que vous avez préparé le TensorFlowLiteC.framework, vous devez d'abord l'ajouter en tant que binaire intégré à la cible de votre application. La section exacte des paramètres du projet pour cela peut différer selon votre version de Xcode.

  • Xcode 11: accédez à l'onglet "Général". de l'éditeur de projet pour la cible de votre application, et ajoutez TensorFlowLiteC.framework sous "Frameworks, libraries and Contenu intégré .
  • Xcode 10 et versions antérieures: accédez à la section "Général". de l'éditeur de projet pour votre cible de l'application, puis ajoutez TensorFlowLiteC.framework sous "Intégré "Binaries". Le framework doit également être ajouté automatiquement sous Frameworks et bibliothèques" .

Lorsque vous ajoutez le framework en tant que binaire intégré, Xcode met également à jour le "Chemins de recherche du framework" sous « Build Settings » pour inclure le bloc de votre framework. Si ce n'est pas le cas, vous doit ajouter manuellement le répertoire parent de TensorFlowLiteC.framework .

Une fois ces deux paramètres définis, vous devriez être en mesure d'importer et d'appeler la méthode L'API C de LiteRT, définie par les fichiers d'en-tête sous Répertoire TensorFlowLiteC.framework/Headers.