TensorFlow-Operatoren auswählen

Da die integrierte LiteRT-Operator-Bibliothek nur eine nicht jedes Modell ist konvertierbar. Weitere Informationen Weitere Informationen zur Operatorkompatibilität

Um eine Konvertierung zu ermöglichen, können Nutzer die Verwendung bestimmter TensorFlow-Typen aktivieren Ops in ihrem LiteRT-Modell an. Wenn Sie jedoch Für LiteRT-Modelle mit TensorFlow-Operationen muss der Kern TensorFlow-Laufzeit, die die binäre Größe des LiteRT-Interpreters erhöht. Bei Android können Sie dies vermeiden, indem Sie nur den erforderlichen Tensorflow erstellen. Ops. Weitere Informationen finden Sie unter Binärzahlen reduzieren Größe.

In diesem Dokument wird beschrieben, wie Sie Daten konvertieren und Führen Sie ein LiteRT-Modell aus, das TensorFlow-Operationen auf einem Plattform Ihrer Wahl. Außerdem werden Leistung und Größe Messwerte und bekannte Einschränkungen.

Modell konvertieren

Das folgende Beispiel zeigt, wie Sie ein LiteRT-Modell mit select TensorFlow-Vorgänge

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 LiteRT 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 Sie ein LiteRT-Modell verwenden, das mit Unterstützung für TensorFlow-Operationen auswählen, muss der Client auch eine LiteRT-Laufzeit verwenden, enthält die erforderliche Bibliothek für TensorFlow-Operationen.

AAE für Android

Um die Binärgröße zu reduzieren, erstellen Sie Ihre eigenen benutzerdefinierten AAR-Dateien wie in der Anleitung beschrieben. im nächsten Abschnitt. Ist die binäre Größe kein Bedenken haben, empfehlen wir, die vorkonfigurierten automatisch angewendeten Empfehlungen für TensorFlow-Operationen zu verwenden. gehostet bei MavenCentral.

Sie können dies in Ihren build.gradle-Abhängigkeiten angeben, indem Sie es zusammen mit Standard-AAE für LiteRT:

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 Momentaufnahmen verwenden möchten, achten Sie darauf, dass Sie einen Sonatype-Snapshot hinzugefügt haben. .

Nachdem Sie die Abhängigkeit hinzugefügt haben, wird der für die Verarbeitung der sollten die TensorFlow-Operationen des Graphen automatisch für Grafiken installiert werden, .

Hinweis: Die TensorFlow-Operationsabhängigkeit ist relativ groß. Wahrscheinlich werden Sie unnötige x86-ABIs in Ihrer .gradle-Datei herausfiltern, Ihr abiFilters.

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

AAE für Android erstellen

Zur Reduzierung der Binärgröße oder für andere fortgeschrittene Fälle können Sie auch den manuell in die Bibliothek aufnehmen. Annahme eines funktionierenden LiteRT-Builds Umgebung, erstellen Sie die automatisch angewendeten Empfehlungen für Android und wählen Sie TensorFlow-Operationen als folgt:

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 Integrierte LiteRT- und benutzerdefinierte Vorgänge: und generieren Sie die AAR-Datei. bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar für TensorFlow-Vorgänge Wenn Sie keine funktionierende Build-Umgebung haben, können Sie die oben genannten Dateien auch mit docker enthält.

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

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

Vergewissern Sie sich schließlich in der build.gradle Ihrer App, dass mavenLocal() vorhanden ist. und ersetzen Sie die Standard-LiteRT-Abhängigkeit durch die Abhängigkeit, die unterstützt ausgewählte TensorFlow-Operationen:

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

LiteRT bietet nächtliche vorgefertigte, ausgewählte TF Ops CocoaPods für arm64, auf die Sie neben dem TensorFlowLiteSwift- oder TensorFlowLiteObjC CocoaPods.

Hinweis: Wenn Sie ausgewählte TF-Operationen in einem x86_64-Simulator verwenden müssen, können Sie das Select-Ops-Framework. Weitere Informationen finden Sie unter Baby und Xcode verwenden. .

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

Nach dem Ausführen von pod install müssen Sie ein zusätzliches Verknüpfungs-Flag angeben, das Auswählen des TF Ops-Frameworks in Ihr Projekt zu erzwingen. In Ihrem Xcode-Projekt Gehe 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 alle Modelle ausführen können, die mit dem SELECT_TF_OPS konvertiert wurden, in Ihrer iOS-App. Beispielsweise können Sie die Bildklassifizierung für iOS App um die Funktion 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

LiteRT mit ausgewählten TensorFlow-Operationen für iOS kann mit Bazel erstellt werden. Folgen Sie der Erstellungsanleitung für iOS, um die Bazel-Arbeitsbereich und .bazelrc-Datei korrekt.

Nachdem Sie den Arbeitsbereich mit aktivierter iOS-Unterstützung konfiguriert haben, können Sie den folgenden Befehl zum Erstellen des Add-on-Frameworks „Select TF Ops“, das hinzugefügt werden kann zusätzlich zum regulären TensorFlowLiteC.framework. Wenn Sie TF Ops auswählen, Framework nicht für die i386-Architektur erstellt werden kann, müssen Sie Geben Sie die Liste der Zielarchitekturen ohne i386 an.

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

Dadurch wird das Framework unter bazel-bin/tensorflow/lite/ios/ erstellt. -Verzeichnis. Sie können dieses neue Framework zu Ihrem Xcode-Projekt hinzufügen, indem Sie die im Abschnitt Xcode-Projekt Einstellungen im iOS-Erstellungsanleitung

Nachdem Sie das Framework Ihrem App-Projekt hinzugefügt haben, wird ein zusätzliches Verknüpfungs-Flag Sollte in Ihrem App-Projekt angegeben werden, um das Laden der ausgewählten TF-Operationen zu erzwingen Framework. 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 von LiteRT mit Bazel oder CMake arbeiten Interpreter können Sie Flex-Delegation aktivieren, indem Sie einen LiteRT Flex verknüpfen der gemeinsam genutzten Bibliothek delegieren. 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 gemeinsam genutzte Bibliothek in bazel-bin/tensorflow/lite/delegates/flex

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

Beachten Sie, dass die erforderliche TfLiteDelegate automatisch installiert wird, wenn Erstellen des Interpreters zur Laufzeit, solange die gemeinsam genutzte Bibliothek verknüpft ist. Es ist nicht erforderlich, um die Delegatinstanz explizit zu installieren, wie es üblicherweise für andere Delegattypen erforderlich.

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

Python

LiteRT mit ausgewählten TensorFlow-Operationen wird automatisch installiert mit Das TensorFlow-PIP-Paket. Sie können Sie wählen auch aus, dass nur die LiteRT-Interpreter-PIP installiert wird. Paket.

Messwerte

Leistung

Wenn Sie eine Mischung aus integrierten und ausgewählten TensorFlow-Operationen verwenden, LiteRT-Optimierungen und optimierte integrierte Vorgänge sind verfügbar und das mit dem konvertierten Modell verwendet werden kann.

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

Build 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 LiteRT für jeden Build beschrieben. Diese Ziele wurden mit --config=android_arm -c opt für Android erstellt.

Build 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 i3d-kinetics-400 erstellt. Modell mit 8 integrierten TFLite-Operationen und 3 Tensorflow-Operationen. Weitere Informationen finden Sie in der Reduzieren Sie die Größe des Binärprogramms für LiteRT.

Bekannte Einschränkungen

  • Nicht unterstützte Typen: Bestimmte TensorFlow-Operationen unterstützen möglicherweise nicht alle die in TensorFlow typischerweise verfügbar sind.

Updates

  • Version 2.6 <ph type="x-smartling-placeholder">
      </ph>
    • Unterstützung für GraphDef-attributbasierte Operatoren und HashTable-Ressource die Initialisierungen verbessert.
  • Version 2.5 <ph type="x-smartling-placeholder">
  • Version 2.4 <ph type="x-smartling-placeholder">
      </ph>
    • Die Kompatibilität mit hardwarebeschleunigten Bevollmächtigten wurde verbessert.