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 CocoaPods TensorFlow Lite. Voir 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 une structure statique à celle dynamique fournie. 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 vous ne l'avez 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 système de build principal pour TensorFlow. Installez Bazel en suivant les 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 de paiement racine 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 que Bazel est correctement configuré avec le support 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 bazel-bin/tensorflow/lite/ios/ sous votre répertoire racine TensorFlow. Par défaut, le framework généré contient un binaire "fat", contenant armv7, arm64 et x86_64 (mais pas i386). Pour voir la liste complète des drapeaux de construction utilisés lorsque vous spécifiez --config=ios_fat , veuillez vous référer à la section configs iOS dans le fichier .bazelrc .

Construire le framework statique TensorFlowLiteC

Par défaut, nous distribuons uniquement le framework dynamique 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 bazel-bin/tensorflow/lite/ios/ sous votre répertoire racine TensorFlow. Ce cadre statique peut être utilisé exactement de la même manière que le cadre dynamique.

Construire 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 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 nécessaires 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 cadre 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 de 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 du langage dans lequel votre application est écrite, mais pas les deux. Les étapes exactes d'utilisation des versions locales de TensorFlow Lite diffèrent en fonction de la partie exacte que vous souhaitez créer.

Utilisation des API Swift ou Objective-C locales

Si vous utilisez CocoaPods et que vous 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 dans 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"
    Cela permet de garantir que vous construisez vos API Swift ou Objective-C par rapport à la dernière version nocturne disponible des API TensorFlowLiteC (construite chaque nuit entre 1h et 4h du matin, heure du Pacifique) plutôt qu'à 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 Utiliser le noyau local de TensorFlow Lite ci-dessous).

  3. Dans le Podfile de votre projet iOS, modifiez la dépendance comme suit pour pointer vers le chemin local vers 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 de spécifications CocoaPods privé et publier votre framework TensorFlowLiteC personnalisé dans votre référentiel 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 sur l'utilisation de CocoaPods privés pour l'utiliser dans votre propre projet. Vous pouvez également modifier 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 la 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 sont 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 la dépendance TensorFlow Lite dans 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 cadre réel 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é à votre cible d'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 le TensorFlowLiteC.framework sous 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 "Fichiers 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 met également à jour l'entrée "Framework Search Paths" sous l'onglet "Build Settings" 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 .