Réserve cette date! Google I / O revient du 18 au 20 mai S'inscrire maintenant
Cette page a été traduite par l'API Cloud Translation.
Switch to English

Sélectionnez les opérateurs TensorFlow

Étant donné que la bibliothèque d'opérateurs intégrée TensorFlow Lite ne prend en charge qu'un nombre limité d'opérateurs TensorFlow, tous les modèles ne sont pas convertibles. Pour plus de détails, reportez-vous à la compatibilité des opérateurs .

Pour autoriser la conversion, les utilisateurs peuvent activer l'utilisation de certaines opérations TensorFlow dans leur modèle TensorFlow Lite. Cependant, l'exécution de modèles TensorFlow Lite avec les opérations TensorFlow nécessite l'extraction du moteur d'exécution principal de TensorFlow, ce qui augmente la taille binaire de l'interpréteur TensorFlow Lite. Pour Android, vous pouvez éviter cela en créant de manière sélective uniquement les opérations Tensorflow requises. Pour plus de détails, reportez-vous à la réduction de la taille binaire .

Ce document décrit comment convertir et exécuter un modèle TensorFlow Lite contenant des opérations TensorFlow sur une plate-forme de votre choix. Il aborde également les mesures de performances et de taille et les limitations connues .

Convertir un modèle

L'exemple suivant montre comment générer un modèle TensorFlow Lite avec certaines opérations TensorFlow.

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.target_spec.supported_ops = [
  tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

Exécuter l'inférence

Lors de l'utilisation d'un modèle TensorFlow Lite qui a été converti avec la prise en charge de certaines opérations TensorFlow, le client doit également utiliser un environnement d'exécution TensorFlow Lite qui inclut la bibliothèque nécessaire d'opérations TensorFlow.

Android AAR

Pour réduire la taille binaire, veuillez créer vos propres fichiers AAR personnalisés comme indiqué dans la section suivante . Si la taille binaire n'est pas un problème considérable, nous vous recommandons d'utiliser l' AAR prédéfini avec les opérations TensorFlow hébergées chez JCenter .

Vous pouvez le spécifier dans vos dépendances build.gradle en l'ajoutant à côté de l'AAR TensorFlow Lite standard comme suit:

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    // This dependency adds the necessary TF op support.
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly-SNAPSHOT'
}

Une fois que vous avez ajouté la dépendance, le délégué nécessaire pour gérer les opérations TensorFlow du graphique doit être automatiquement installé pour les graphiques qui en ont besoin.

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

Construire l'AAR Android

Pour réduire la taille binaire ou d'autres cas avancés, vous pouvez également créer la bibliothèque manuellement. En supposant un environnement de construction TensorFlow Lite fonctionnel, créez l'AAR Android avec certaines opérations TensorFlow comme suit:

sh tensorflow/lite/tools/build_aar.sh \
  --input_models=/a/b/model_one.tflite,/c/d/model_two.tflite \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a

Cela générera le fichier AAR bazel-bin/tmp/tensorflow-lite.aar pour les opérations intégrées et personnalisées de TensorFlow Lite; et générez le fichier AAR bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar pour les opérations TensorFlow. Si vous ne disposez pas d'un environnement de construction fonctionnel, vous pouvez également créer les fichiers ci-dessus avec docker .

À partir de là, vous pouvez soit importer les fichiers AAR directement dans votre projet, soit publier les fichiers AAR personnalisés dans votre référentiel Maven local:

mvn install:install-file \
  -Dfile=bazel-bin/tmp/tensorflow-lite.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite -Dversion=0.1.100 -Dpackaging=aar
mvn install:install-file \
  -Dfile=bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite-select-tf-ops -Dversion=0.1.100 -Dpackaging=aar

Enfin, dans build.gradle votre application, assurez-vous d'avoir la dépendance mavenLocal() et remplacez la dépendance TensorFlow Lite standard par celle qui prend en charge certaines opérations TensorFlow:

allprojects {
    repositories {
        jcenter()
        mavenLocal()
    }
}

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.1.100'
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.1.100'
}

iOS

Utilisation de CocoaPods

Nous fournissons des CocoaPods TF ops sélectionnés tous les soirs pour armv7 et arm64 , sur lesquels vous pouvez compter aux côtés des CocoaPods TensorFlowLiteSwift ou TensorFlowLiteObjC .

# In your Podfile target:
  pod 'TensorFlowLiteSwift'   # or 'TensorFlowLiteObjC'
  pod 'TensorFlowLiteSelectTfOps', '~> 0.0.1-nightly'

Après avoir exécuté l' pod install , vous devez fournir un indicateur de l'éditeur de liens supplémentaire pour forcer le chargement du cadre d'opérations TF sélectionné dans votre projet. Dans votre projet Xcode, allez dans Build Settings -> Other Linker Flags , et ajoutez:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

Vous devriez alors pouvoir exécuter tous les modèles convertis avec SELECT_TF_OPS dans votre application iOS. Par exemple, vous pouvez modifier l'application iOS de classification d'image pour tester la fonctionnalité de sélection des opérations TF.

  • Remplacez le fichier de modèle par celui converti avec SELECT_TF_OPS activé.
  • Ajoutez la dépendance TensorFlowLiteSelectTfOps au Podfile comme indiqué.
  • Ajoutez l'indicateur de lien supplémentaire comme ci-dessus.
  • Exécutez l'exemple d'application et voyez si le modèle fonctionne correctement.

Utiliser Bazel + Xcode

TensorFlow Lite avec certaines opérations TensorFlow pour iOS peut être créé à l'aide de Bazel. Tout d'abord, suivez les instructions de construction iOS pour configurer correctement votre espace de travail Bazel et .bazelrc fichier .bazelrc .

Une fois que vous avez configuré l'espace de travail avec le support iOS activé, vous pouvez utiliser la commande suivante pour créer le framework d'addon TF ops, qui peut être ajouté au-dessus du TensorFlowLiteC.framework normal. Notez que le cadre d'opérations TF sélectionné ne peut pas être construit pour l'architecture i386 , vous devez donc fournir explicitement la liste des architectures cibles à l'exclusion de i386 .

bazel build -c opt --config=ios --ios_multi_cpus=armv7,arm64,x86_64 \
  //tensorflow/lite/ios:TensorFlowLiteSelectTfOps_framework

Cela générera le framework sous le bazel-bin/tensorflow/lite/ios/ . Vous pouvez ajouter ce nouveau framework à votre projet Xcode en suivant les étapes similaires décrites dans la section Paramètres du projet Xcode dans le guide de build iOS.

Après avoir ajouté le cadre dans votre projet d'application, un indicateur de l'éditeur de liens supplémentaire doit être spécifié dans votre projet d'application pour forcer le chargement du cadre d'opérations TF sélectionné. Dans votre projet Xcode, allez dans Build Settings -> Other Linker Flags , et ajoutez:

-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>

C ++

Lors de la création de bibliothèques TensorFlow Lite à l'aide du pipeline bazel, la bibliothèque d'opérations TensorFlow supplémentaire peut être incluse et activée comme suit:

  • Activez les builds monolithiques si nécessaire en ajoutant l' --config=monolithic build --config=monolithic .
  • Ajoutez la dépendance de bibliothèque de délégués d'opérations TensorFlow aux dépendances de construction: tensorflow/lite/delegates/flex:delegate .

Notez que le TfLiteDelegate nécessaire sera installé automatiquement lors de la création de l'interpréteur au moment de l'exécution tant que le délégué est lié à la bibliothèque cliente. Il n'est pas nécessaire d'installer explicitement l'instance de délégué comme cela est généralement requis avec d'autres types de délégués.

Python

TensorFlow Lite avec certaines opérations TensorFlow sera installé automatiquement avec le package pip TensorFlow . Vous pouvez également choisir d'installer uniquement lepackage pip de l'interpréteur TensorFlow Lite .

Métrique

Performance

Lorsque vous utilisez un mélange d'opérations TensorFlow intégrées et sélectionnées, toutes les mêmes optimisations TensorFlow Lite et les opérations intégrées optimisées seront disponibles et utilisables avec le modèle converti.

Le tableau suivant décrit le temps moyen nécessaire pour exécuter l'inférence sur MobileNet sur un Pixel 2. Les durées répertoriées correspondent à une moyenne de 100 exécutions. Ces cibles ont été construites pour Android en utilisant les indicateurs: --config=android_arm64 -c opt .

Construire Temps (millisecondes)
Uniquement les opérations TFLITE_BUILTIN ( TFLITE_BUILTIN ) 260,7
Utilisation uniquement des opérations TF ( SELECT_TF_OPS ) 264,5

Taille binaire

Le tableau suivant décrit la taille binaire de TensorFlow Lite pour chaque build. Ces cibles ont été --config=android_arm -c opt pour Android en utilisant --config=android_arm -c opt .

Construire Taille binaire C ++ Taille de l'APK Android
Uniquement les opérations intégrées 796 Ko 561 Ko
Opérations intégrées + opérations TF 23,0 Mo 8,0 Mo
Opérations intégrées + opérations TF (1) 4,1 Mo 1,8 Mo

(1) Ces bibliothèques sont conçues de manière sélective pour le modèle i3d-kinetics-400 avec 8 opérations intégrées TFLite et 3 opérations Tensorflow. Pour plus de détails, veuillez consulter la section Réduire la taille binaire de TensorFlow Lite .

Limitations connues

  • Types non pris en charge: certaines opérations TensorFlow peuvent ne pas prendre en charge l'ensemble complet des types d'entrée / sortie qui sont généralement disponibles dans TensorFlow.
  • HashTableV2 non prises en charge: les opérations de flux de contrôle et les opérations qui nécessitent une initialisation explicite à partir de ressources, comme HashTableV2 , ne sont pas encore prises en charge.

Mises à jour

  • Version 2.5 (pas encore officiellement publiée)
  • Version 2.4
    • La compatibilité avec les délégués à accélération matérielle s'est améliorée