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ängigkeitTensorFlowLiteSelectTfOps
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
- Sie können eine Optimierung anwenden, die als Quantisierung nach dem Training bezeichnet wird.
- Version 2.4
- Die Kompatibilität mit hardwarebeschleunigten Bevollmächtigten wurde verbessert.