Créer TensorFlow Lite pour iOS

Ce document décrit comment créer vous-même la bibliothèque iOS TensorFlow Lite. Normalement, vous n'avez pas besoin de créer localement la bibliothèque iOS TensorFlow Lite. Si vous souhaitez simplement l'utiliser, le moyen le plus simple consiste à utiliser les versions stables ou nocturnes prédéfinies des TensorFlow Lite CocoaPods. Consultez le démarrage rapide iOS pour plus de détails sur la façon de les utiliser dans vos projets iOS.

Construire localement

Dans certains cas, vous souhaiterez peut-être utiliser une version locale de TensorFlow Lite, par exemple lorsque vous souhaitez apporter des modifications locales à TensorFlow Lite et tester ces modifications dans votre application iOS ou si vous préférez utiliser un framework statique plutôt que dynamique fourni. Pour créer localement un framework iOS universel pour TensorFlow Lite, vous devez le créer à l'aide de Bazel sur une machine macOS.

Installer Xcode

Si ce n'est pas déjà fait, vous devrez installer Xcode 8 ou version ultérieure et les outils utilisant 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 construction pour TensorFlow. Installez Bazel conformément aux instructions sur le site Web de Bazel . Assurez-vous de choisir une version entre _TF_MIN_BAZEL_VERSION et _TF_MAX_BAZEL_VERSION dans le fichier configure.py à la racine du référentiel tensorflow .

Configurer WORKSPACE et .bazelrc

Exécutez le script ./configure dans le répertoire racine d'extraction de TensorFlow et répondez « Oui » lorsque le script vous demande si vous souhaitez créer TensorFlow avec la prise en charge d'iOS.

Une fois Bazel correctement configuré avec la prise en charge iOS, vous pouvez créer le framework TensorFlowLiteC avec la commande suivante.

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

Cette commande générera le fichier TensorFlowLiteC_framework.zip sous le répertoire bazel-bin/tensorflow/lite/ios/ sous votre répertoire racine TensorFlow. Par défaut, le framework généré contient un binaire « gros », contenant armv7, arm64 et x86_64 (mais pas de i386). Pour voir la liste complète des indicateurs de build utilisés lorsque vous spécifiez --config=ios_fat , veuillez vous référer à la section des configurations iOS dans le fichier .bazelrc .

Créer un framework statique TensorFlowLiteC

Par défaut, nous distribuons le framework dynamique uniquement via Cocoapods. Si vous souhaitez utiliser le framework statique à la place, vous pouvez créer le framework statique TensorFlowLiteC avec la commande suivante :

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

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

Construire sélectivement des frameworks TFLite

Vous pouvez créer des frameworks plus petits ciblant uniquement un ensemble de modèles à l'aide de la construction sélective, qui ignorera les opérations inutilisées dans votre ensemble de modèles et n'inclura que les noyaux opérationnels requis pour exécuter 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érera le framework statique bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip pour les opérations intégrées et personnalisées de TensorFlow 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 Select TensorFlow. Notez que l'indicateur --target_archs peut être utilisé pour spécifier vos architectures de déploiement.

Utiliser dans votre propre application

Développeurs CocoaPods

Il existe trois CocoaPods pour TensorFlow Lite :

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

En tant que développeur, vous devez choisir le pod TensorFlowLiteSwift ou TensorFlowLiteObjC en fonction de la langue dans laquelle votre application est écrite, mais pas les deux. Les étapes exactes d'utilisation des versions locales de TensorFlow Lite diffèrent selon la partie exacte que vous souhaitez créer.

Utilisation d'API locales Swift ou Objective-C

Si vous utilisez CocoaPods et souhaitez uniquement tester certaines modifications locales apportées aux API Swift ou aux API Objective-C de TensorFlow Lite, suivez les étapes ici.

  1. Apportez des modifications aux API Swift ou Objective-C lors de votre paiement tensorflow .

  2. Ouvrez le fichier TensorFlowLite(Swift|ObjC).podspec et mettez à jour cette ligne :
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    être:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    Ceci permet de garantir que vous construisez vos API Swift ou Objective-C avec la dernière version nocturne disponible des API TensorFlowLiteC (construites chaque nuit entre 1h et 4h du matin, heure du Pacifique) plutôt qu'avec la version stable, qui peut être obsolète par rapport à votre tensorflow local. vérifier. Vous pouvez également choisir de publier votre propre version de TensorFlowLiteC et d'utiliser cette version (voir la section Utilisation du noyau TensorFlow Lite local ci-dessous).

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

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

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

Utiliser le noyau TensorFlow Lite local

Vous pouvez configurer un référentiel privé de spécifications CocoaPods et publier votre framework TensorFlowLiteC personnalisé sur votre dépôt privé. Vous pouvez copier ce fichier podspec et modifier 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 les instructions d'utilisation de CocoaPods privés pour l'utiliser dans votre propre projet. Vous pouvez également modifier le TensorFlowLite(Swift|ObjC).podspec pour pointer vers votre pod TensorFlowLiteC personnalisé et utiliser le pod Swift ou Objective-C dans votre projet d'application.

Développeurs Bazel

Si vous utilisez Bazel comme outil de construction principal, vous pouvez simplement ajouter une 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 créez votre projet d'application, toutes les modifications apportées à la bibliothèque TensorFlow Lite seront récupérées et intégrées à votre application.

Modifier directement les paramètres du projet Xcode

Il est fortement recommandé d'utiliser CocoaPods ou Bazel pour ajouter une dépendance TensorFlow Lite à votre projet. Si vous souhaitez toujours ajouter le framework TensorFlowLiteC manuellement, vous devrez ajouter le framework TensorFlowLiteC en tant que framework intégré à votre projet d'application. Décompressez le TensorFlowLiteC_framework.zip généré à partir de la version ci-dessus pour obtenir le répertoire TensorFlowLiteC.framework . Ce répertoire est le véritable 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 à cet effet peut différer en fonction de 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 le TensorFlowLiteC.framework dans la section « Frameworks, bibliothèques et contenu intégré ».
  • Xcode 10 et versions antérieures : accédez à l'onglet "Général" de l'éditeur de projet pour la cible de votre application et ajoutez le TensorFlowLiteC.framework sous "Binaires intégrés". Le framework doit également être ajouté automatiquement dans la section « Frameworks et bibliothèques liés ».

Lorsque vous ajoutez le framework en tant que binaire intégré, Xcode mettra également à jour l'entrée « Chemins de recherche du framework » sous l'onglet « Paramètres de construction » pour inclure le répertoire parent de votre framework. Si cela ne se produit pas automatiquement, vous devez ajouter manuellement le répertoire parent du répertoire TensorFlowLiteC.framework .

Une fois ces deux paramètres définis, vous devriez pouvoir importer et appeler l'API C de TensorFlow Lite, définie par les fichiers d'en-tête sous le répertoire TensorFlowLiteC.framework/Headers .