Compiler TensorFlow Lite pour iOS

Ce document explique comment créer vous-même une bibliothèque iOS TensorFlow Lite. Normalement, vous n'avez pas besoin de compiler 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éconfigurées des CocoaPods TensorFlow Lite. Consultez le guide de démarrage rapide pour iOS pour savoir comment les utiliser dans vos projets iOS.

Construire localement

Dans certains cas, vous pouvez utiliser un build local de TensorFlow Lite, par exemple lorsque vous souhaitez apporter des modifications locales à TensorFlow Lite et tester ces modifications dans votre application iOS, ou lorsque vous préférez utiliser un framework statique par rapport à notre framework dynamique fourni. Pour créer localement un framework iOS universel pour TensorFlow Lite, 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, à l'aide de xcode-select:

xcode-select --install

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

sudo xcodebuild -license accept

Installer Bazel

Bazel est le système de compilation principal de TensorFlow. Installez Bazel conformément aux instructions disponibles sur le site Web de Bazel. Veillez à choisir une version comprise entre _TF_MIN_BAZEL_VERSION et _TF_MAX_BAZEL_VERSION dans le 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 TensorFlow racine, puis répondez "Yes" (Oui) lorsque le script vous demande si vous souhaitez compiler TensorFlow pour iOS.

Une fois Bazel correctement configuré et compatible avec iOS, vous pouvez créer le framework 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 dans le répertoire bazel-bin/tensorflow/lite/ios/ du répertoire racine TensorFlow. Par défaut, le framework généré contient un binaire "fat" contenant armv7, arm64 et x86_64 (mais pas d'i386). Pour afficher la liste complète des indicateurs de compilation utilisés lorsque vous spécifiez --config=ios_fat, consultez la section sur les configurations iOS dans le fichier .bazelrc.

Créer le framework statique TensorFlowLiteC

Par défaut, nous ne distribuons le framework dynamique que via CocoaPods. Si vous préférez utiliser le framework statique, vous pouvez créer le framework 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 sous le répertoire bazel-bin/tensorflow/lite/ios/ de votre répertoire racine TensorFlow. Ce framework statique peut être utilisé exactement de la même manière que le framework 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 d'une compilation sélective, ce qui ignorera les opérations inutilisées de votre ensemble de modèles et n'inclura que les noyaux d'opérations 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ère 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. Elle génère éventuellement le framework statique bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip si vos modèles contiennent des opérations TensorFlow Lite sélectionnées. Notez que vous pouvez utiliser 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 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 l'environnement d'exécution principal de TensorFlow Lite et expose les API C de base utilisées par les deux pods ci-dessus. Ils ne sont pas destinés à être utilisés 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. La procédure exacte d'utilisation des builds locaux de TensorFlow Lite diffère selon la partie que vous souhaitez compiler.

Utiliser des API locales Swift ou Objective-C

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 ci-dessous.

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

  2. Ouvrez le fichier TensorFlowLite(Swift|ObjC).podspec et modifiez cette ligne:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    et définissez-la comme suit:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    Cela vous permet de vous assurer que vous compilez vos API Swift ou Objective-C avec la dernière version nocturne des API TensorFlowLiteC disponible (créée chaque nuit entre 1h et 4h, heure du Pacifique) plutôt que la version stable, qui peut être obsolète par rapport à votre règlement tensorflow local. Vous pouvez également choisir de publier votre propre version de TensorFlowLiteC et de l'utiliser (consultez la section Utiliser le cœur local de TensorFlow Lite ci-dessous).

  3. Dans le fichier Podfile de votre projet iOS, modifiez la dépendance comme suit pour qu'elle pointe vers le chemin d'accès local au 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 recompilez votre application dans Xcode.

Utiliser le noyau TensorFlow Lite local

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

Développeurs Bazel

Si vous utilisez Bazel comme outil de compilation 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 compilez votre projet d'application, toutes les modifications apportées à la bibliothèque TensorFlow Lite sont intégrées et intégrées à votre application.

Modifier directement les paramètres du projet Xcode

Nous vous recommandons vivement d'utiliser CocoaPods ou Bazel pour ajouter la dépendance TensorFlow Lite à votre projet. Si vous souhaitez toujours ajouter le framework TensorFlowLiteC manuellement, vous devez ajouter le framework TensorFlowLiteC en tant que framework intégré à votre projet d'application. Décompressez le fichier TensorFlowLiteC_framework.zip généré à partir de la compilation ci-dessus pour obtenir le répertoire TensorFlowLiteC.framework. Ce répertoire est le framework 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é à la cible de votre application. La section exacte des paramètres du projet peut varier en fonction de votre version de Xcode.

  • Xcode 11: accédez à l'onglet "General" (Général) de l'éditeur de projet pour la cible de votre application, puis ajoutez TensorFlowLiteC.framework dans la section "Frameworks, bibliothèques et contenu intégré".
  • Xcode 10 et versions antérieures: accédez à l'onglet "General" (Général) de l'éditeur de projet pour la cible de votre application, puis ajoutez TensorFlowLiteC.framework sous "Embedded Binaires" (Binaires intégrés). Le framework doit également être ajouté automatiquement dans la section "Frameworks et bibliothèques associés".

Lorsque vous ajoutez le framework en tant que binaire intégré, Xcode met également à jour l'entrée "Chemins de recherche de framework" sous l'onglet "Paramètres de compilation" pour inclure le répertoire parent de votre framework. Si ce n'est pas le cas 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 du répertoire TensorFlowLiteC.framework/Headers.