TensorFlow-Operatoren auswählen

Da die integrierte TensorFlow Lite-Operatorbibliothek nur eine begrenzte Anzahl von TensorFlow-Operatoren unterstützt, ist nicht jedes Modell konvertierbar. Weitere Informationen finden Sie im Abschnitt zur Kompatibilität mit Operatoren.

Nutzer können die Verwendung bestimmter TensorFlow-Operationen in ihrem TensorFlow Lite-Modell aktivieren, um Konvertierungen zu ermöglichen. Zum Ausführen von TensorFlow Lite-Modellen mit TensorFlow-Operationen muss jedoch die TensorFlow-Kernlaufzeit geladen werden, wodurch die binäre Größe des TensorFlow Lite-Interpreters erhöht wird. Bei Android können Sie dies vermeiden, indem Sie nur die erforderlichen Tensorflow-Vorgänge erstellen. Weitere Informationen finden Sie unter Binärgröße reduzieren.

In diesem Dokument wird beschrieben, wie Sie ein TensorFlow Lite-Modell mit TensorFlow-Operationen auf einer Plattform Ihrer Wahl konvertieren und run. Außerdem werden Leistungs- und Größenmesswerte sowie bekannte Einschränkungen erläutert.

Modell konvertieren

Das folgende Beispiel zeigt, wie ein TensorFlow Lite-Modell mit ausgewählten TensorFlow-Operationen generiert wird.

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)

Inferenz ausführen

Wenn ein TensorFlow Lite-Modell verwendet wird, das mit Unterstützung für ausgewählte TensorFlow-Operationen konvertiert wurde, muss der Client auch eine TensorFlow Lite-Laufzeit verwenden, die die erforderliche Bibliothek von TensorFlow-Operationen enthält.

AAE für Android

Erstellen Sie eigene benutzerdefinierte AAR-Dateien, um die Binärgröße zu reduzieren. Die Anleitung dazu finden Sie im nächsten Abschnitt. Wenn die Binärgröße kein großes Problem darstellt, empfehlen wir die Verwendung des vordefinierten AAAR mit TensorFlow-Operationen, die in MavenCentral gehostet werden.

Sie können dies in Ihren build.gradle-Abhängigkeiten angeben, indem Sie es wie folgt neben dem standardmäßigen TensorFlow Lite AAR hinzufügen:

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

Wenn Sie nächtliche Snapshots verwenden möchten, müssen Sie das Sonatype-Snapshot-Repository hinzugefügt haben.

Nachdem Sie die Abhängigkeit hinzugefügt haben, sollte der für die Verarbeitung der TensorFlow-Operationen des Diagramms erforderliche Bevollmächtigte automatisch für Grafiken installiert werden, die sie erfordern.

Hinweis: Die TensorFlow-Vorgangsabhängigkeit ist relativ groß. Daher sollten Sie unnötige x86-ABIs in der .gradle-Datei herausfiltern, indem Sie abiFilters einrichten.

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

AAE für Android erstellen

Zur Reduzierung der Binärgröße oder für andere komplexere Fälle können Sie die Bibliothek auch manuell erstellen. Bei einer funktionierenden TensorFlow Lite-Build-Umgebung erstellen Sie Android AAR mit ausgewählten TensorFlow-Operationen so:

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

Dadurch wird die AAR-Datei bazel-bin/tmp/tensorflow-lite.aar für die integrierten und benutzerdefinierten TensorFlow Lite-Vorgänge sowie die AAR-Datei bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar für TensorFlow-Vorgänge generiert. Wenn Sie keine funktionierende Build-Umgebung haben, können Sie die oben aufgeführten Dateien auch mit Docker erstellen.

Dort können Sie die AAR-Dateien entweder direkt in Ihr Projekt importieren oder die benutzerdefinierten AAR-Dateien in Ihrem lokalen Maven-Repository veröffentlichen:

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

Prüfen Sie schließlich im build.gradle Ihrer Anwendung, ob die mavenLocal()-Abhängigkeit festgelegt ist. Ersetzen Sie außerdem die TensorFlow Lite-Standardabhängigkeit durch die Abhängigkeit, die ausgewählte TensorFlow-Operationen unterstützt:

allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        mavenLocal()
    }
}

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

iOS

CocoaPods verwenden

TensorFlow Lite bietet jede Nacht vorgefertigte ausgewählte TF Ops CocoaPods für arm64, auf die Sie sich neben den TensorFlowLiteSwift- oder TensorFlowLiteObjC-CocoaPods verlassen können.

Hinweis: Wenn Sie ausgewählte TF-Operationen in einem x86_64-Simulator verwenden müssen, können Sie das Select-Ops-Framework selbst erstellen. Weitere Informationen finden Sie im Abschnitt JAWS + Xcode verwenden.

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

Nachdem Sie pod install ausgeführt haben, müssen Sie ein zusätzliches Verknüpfungs-Flag angeben, um das Laden des ausgewählten TF Ops-Frameworks in Ihr Projekt zu erzwingen. Gehen Sie in Ihrem Xcode-Projekt zu Build Settings -> Other Linker Flags und fügen Sie Folgendes hinzu:

Für Versionen ab 2.9.0:

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

Für Versionen < 2.9.0:

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

Sie sollten dann in der Lage sein, alle mit SELECT_TF_OPS konvertierten Modelle in Ihrer iOS-App auszuführen. Sie können beispielsweise die iOS-App zur Bildklassifizierung ändern, um das Feature zum Auswählen von TF Ops zu testen.

  • Ersetzen Sie die Modelldatei durch die mit aktiviertem SELECT_TF_OPS konvertierte Datei.
  • Fügen Sie der Podfile die Abhängigkeit TensorFlowLiteSelectTfOps hinzu.
  • Fügen Sie das zusätzliche Verknüpfungs-Flag wie oben hinzu.
  • Führen Sie die Beispiel-App aus und prüfen Sie, ob das Modell korrekt funktioniert.

Bazel + Xcode verwenden

TensorFlow Lite mit ausgewählten TensorFlow-Operationen für iOS kann mit Bazel erstellt werden. Folgen Sie zuerst der Build-Anleitung für iOS, um den Looker-Arbeitsbereich und die .bazelrc-Datei richtig zu konfigurieren.

Nachdem Sie den Arbeitsbereich mit aktivierter iOS-Unterstützung konfiguriert haben, können Sie mit dem folgenden Befehl das TF Ops-Add-on-Framework erstellen, das zusätzlich zum regulären TensorFlowLiteC.framework hinzugefügt werden kann. Beachten Sie, dass das select TF Ops-Framework nicht für die i386-Architektur erstellt werden kann. Daher müssen Sie die Liste der Zielarchitekturen mit Ausnahme von i386 explizit angeben.

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

Dadurch wird das Framework im Verzeichnis bazel-bin/tensorflow/lite/ios/ generiert. Sie können Ihrem Xcode-Projekt dieses neue Framework hinzufügen, indem Sie ähnliche Schritte ausführen, die im Abschnitt Xcode-Projekteinstellungen in der iOS-Erstellungsanleitung beschrieben sind.

Nachdem Sie das Framework in Ihr App-Projekt eingefügt haben, sollten Sie im App-Projekt ein zusätzliches Verknüpfungs-Flag angeben, um das Laden des ausgewählten TF Ops-Frameworks zu erzwingen. Gehen Sie in Ihrem Xcode-Projekt zu Build Settings -> Other Linker Flags und fügen Sie Folgendes hinzu:

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

C/C++-

Wenn Sie zum Erstellen eines TensorFlow Lite-Interpreters Bazel oder CMake verwenden, können Sie Flex Delegate aktivieren, indem Sie eine gemeinsam genutzte Bibliothek des Flex-Delegats von TensorFlow Lite verknüpfen. Sie können sie mit dem folgenden Befehl von Bazel erstellen.

bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex

Dieser Befehl generiert die folgende freigegebene Bibliothek in bazel-bin/tensorflow/lite/delegates/flex.

Plattform Name der Bibliothek
Linux libtensorflowlite_flex.so
macOS libtensorflowlite_flex.dylib
Windows tensorflowlite_flex.dll

Die erforderliche TfLiteDelegate wird automatisch installiert, wenn der Interpreter zur Laufzeit erstellt wird, solange die gemeinsam genutzte Bibliothek verknüpft ist. Die Delegatinstanz muss nicht explizit installiert werden, wie es bei anderen Delegattypen normalerweise erforderlich ist.

Hinweis: Diese Funktion ist seit Version 2.7 verfügbar.

Python

TensorFlow Lite mit ausgewählten TensorFlow-Operationen wird automatisch mit dem TensorFlow-PIP-Paket installiert. Sie können auch nur das pip-Paket des TensorFlow Lite Interpreter installieren.

Messwerte

Leistung

Wenn Sie eine Mischung aus integrierten und ausgewählten TensorFlow-Operationen verwenden, sind dieselben TensorFlow Lite-Optimierungen und optimierten integrierten Operationen verfügbar und können mit dem konvertierten Modell verwendet werden.

In der folgenden Tabelle wird die durchschnittliche Zeit beschrieben, die für die Ausführung einer Inferenz in MobileNet auf einem Pixel 2 benötigt wird. Die angegebenen Zeiten entsprechen einem Durchschnitt von 100 Ausführungen. Diese Ziele wurden mit den Flags --config=android_arm64 -c opt für Android erstellt.

Erstellen Zeit (Millisekunden)
Nur integrierte Vorgänge (TFLITE_BUILTIN) 260,7
Nur TF-Operationen werden verwendet (SELECT_TF_OPS) 264,5

Binärgröße

In der folgenden Tabelle wird die binäre Größe von TensorFlow Lite für jeden Build beschrieben. Diese Ziele wurden mit --config=android_arm -c opt für Android erstellt.

Erstellen C++-Binärgröße Android-APK-Größe
Nur integrierte Vorgänge 796 KB 561 KB
Integrierte Operationen und TF Ops 23,0 MB 8 MB
Integrierte Operationen + TF Ops (1) 4,1 MB 1,8 MB

(1) Diese Bibliotheken wurden selektiv für das i3d-kinetics-400-Modell mit 8 integrierten TFLite-Operationen und 3 Tensorflow-Operationen erstellt. Weitere Informationen finden Sie im Abschnitt Binärgröße für TensorFlow Lite reduzieren.

Bekannte Einschränkungen

  • Nicht unterstützte Typen: Bestimmte TensorFlow-Operationen unterstützen möglicherweise nicht alle Ein-/Ausgabetypen, die normalerweise in TensorFlow verfügbar sind.

Updates

  • Version 2.6
    • Die Unterstützung für GraphDef-attributbasierte Operatoren und HashTable-Ressourceninitialisierungen wurde verbessert.
  • Version 2.5
  • Version 2.4
    • Die Kompatibilität mit hardwarebeschleunigten Bevollmächtigten wurde verbessert.