Auf LiteRT in Google Play-Diensten kann zusätzlich zur Native API auch mit Java APIs zugegriffen werden. Insbesondere LiteRT bei Google Play Dienste sind über den LiteRT-Interpreter verfügbar. API hinzu.
Interpreter APIs verwenden
Die LiteRT Interpreter API, die von der TensorFlow-Laufzeit bereitgestellt wird, bietet eine allgemeine Schnittstelle zum Erstellen und Ausführen von ML-Modellen. Führen Sie die folgenden Schritte aus, um Inferenzen mit der Interpreter API unter Verwendung von TensorFlow Lite in der Google Play-Dienstlaufzeit auszuführen.
1. Projektabhängigkeiten hinzufügen
Füge deinem App-Projektcode die folgenden Abhängigkeiten hinzu, um auf den Play Store zuzugreifen Services API für LiteRT:
dependencies {
...
// LiteRT dependencies for Google Play services
implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
// Optional: include LiteRT Support Library
implementation 'com.google.android.gms:play-services-tflite-support:16.0.1'
...
}
2. Initialisierung von LiteRT hinzufügen
LiteRT-Komponente der Google Play Services API initialisieren bevor Sie die LiteRT APIs verwenden:
Kotlin
val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }
Java
Task<Void> initializeTask = TfLite.initialize(context);
3. Interpreter erstellen und Laufzeitoption festlegen
Erstellen Sie einen Interpreter mit InterpreterApi.create()
und konfigurieren Sie ihn so, dass er die Google Play-Dienste-Laufzeit verwendet. Rufen Sie dazu InterpreterApi.Options.setRuntime()
auf, wie im folgenden Beispielcode gezeigt:
Kotlin
import org.tensorflow.lite.InterpreterApi import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime ... private lateinit var interpreter: InterpreterApi ... initializeTask.addOnSuccessListener { val interpreterOption = InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) interpreter = InterpreterApi.create( modelBuffer, interpreterOption )} .addOnFailureListener { e -> Log.e("Interpreter", "Cannot initialize interpreter", e) }
Java
import org.tensorflow.lite.InterpreterApi import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime ... private InterpreterApi interpreter; ... initializeTask.addOnSuccessListener(a -> { interpreter = InterpreterApi.create(modelBuffer, new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)); }) .addOnFailureListener(e -> { Log.e("Interpreter", String.format("Cannot initialize interpreter: %s", e.getMessage())); });
Sie sollten die oben beschriebene Implementierung verwenden, da dadurch der Android-Benutzeroberflächen-Thread nicht blockiert wird. Wenn Sie die Threadausführung genauer verwalten möchten, können Sie beim Erstellen des Interpreters einen Tasks.await()
-Aufruf hinzufügen:
Kotlin
import androidx.lifecycle.lifecycleScope ... lifecycleScope.launchWhenStarted { // uses coroutine initializeTask.await() }
Java
@BackgroundThread InterpreterApi initializeInterpreter() { Tasks.await(initializeTask); return InterpreterApi.create(...); }
4. Inferenzen ausführen
Rufen Sie mit dem von Ihnen erstellten interpreter
-Objekt die Methode run()
auf, um eine Inferenz zu generieren.
Kotlin
interpreter.run(inputBuffer, outputBuffer)
Java
interpreter.run(inputBuffer, outputBuffer);
Hardwarebeschleunigung
Mit LiteRT können Sie die Leistung Ihres Modells mithilfe von Spezialisierte Hardwareprozessoren wie GPUs (Graphics Processing Units) Ich können diese speziellen Prozessoren mithilfe von Hardwaretreibern nutzen, Bevollmächtigten.
Der GPU Delegate wird über die Google Play-Dienste bereitgestellt. und dynamisch geladen werden, genau wie die Play-Dienste-Versionen Interpreter API.
Gerätekompatibilität prüfen
Nicht alle Geräte unterstützen die GPU-Hardwarebeschleunigung mit TFLite. Um
Fehler und potenzielle Abstürze zu minimieren, verwenden Sie
TfLiteGpu.isGpuDelegateAvailable
-Methode zu prüfen, ob ein Gerät
ist mit dem GPU-Delegaten kompatibel.
Mit dieser Methode können Sie prüfen, ob ein Gerät mit der GPU kompatibel ist, und die CPU als Fallback verwenden, wenn die GPU nicht unterstützt wird.
useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)
Sobald Sie eine Variable wie useGpuTask
haben, können Sie damit feststellen, ob Geräte den GPU-Delegierten verwenden.
Kotlin
val interpreterTask = useGpuTask.continueWith { task -> val interpreterOptions = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) if (task.result) { interpreterOptions.addDelegateFactory(GpuDelegateFactory()) } InterpreterApi.create(FileUtil.loadMappedFile(context, MODEL_PATH), interpreterOptions) }
Java
Task<InterpreterApi.Options> interpreterOptionsTask = useGpuTask.continueWith({ task -> InterpreterApi.Options options = new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY); if (task.getResult()) { options.addDelegateFactory(new GpuDelegateFactory()); } return options; });
GPU mit Interpreter APIs
So verwenden Sie den GPU-Delegierten mit den Interpreter APIs:
Aktualisieren Sie die Projektabhängigkeiten, um den GPU-Delegaten aus den Play-Diensten zu verwenden:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
Aktivieren Sie die Option „GPU-Delegierung“ in der TFlite-Initialisierung:
Kotlin
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Java
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
GPU Delegate in den Interpreter-Optionen aktivieren: Setze die Delegate Factory auf GpuDelegateFactory durch Aufrufen von
addDelegateFactory() within
InterpreterApi.Options()`:Kotlin
val interpreterOption = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(GpuDelegateFactory())
Java
Options interpreterOption = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(new GpuDelegateFactory());
Von eigenständigem LiteRT migrieren
Wenn Sie Ihre App von der eigenständigen LiteRT-Version zur Play-Dienste API migrieren möchten, lesen Sie die folgenden zusätzlichen Informationen zum Aktualisieren des App-Projektcodes:
- Lesen Sie den Abschnitt Einschränkungen auf dieser Seite, um sicherzustellen, Anwendungsfall unterstützt.
- Führen Sie vor der Aktualisierung des Codes Leistungs- und Genauigkeitsprüfungen für Ihre insbesondere wenn Sie ältere LiteRT-Versionen verwenden, als Version 2.1. So haben Sie eine Referenz, die Sie mit der neuen Version vergleichen können, Implementierung.
- Wenn Sie Ihren gesamten Code migriert haben, um die Play Services API für
LiteRT sollten Sie die vorhandene LiteRT--Laufzeit entfernen.
Library-Abhängigkeiten (Einträge mit
org.tensorflow:tensorflow-lite:*
) aus Ihrer build.gradle-Datei -Datei, um die App-Größe zu reduzieren. - Suchen Sie in Ihrem Code nach allen Vorkommen der
new Interpreter
-Objekterstellung und ändern Sie sie so, dass der Aufruf InterpreterApi.create() verwendet wird. Die neue Funktion „TfLite.initialize“ ist asynchron. Das bedeutet, dass sie in den meisten Fällen nicht einfach ersetzt werden kann: Sie müssen einen Listener für den Abschluss des Aufrufs registrieren. Siehe Code-Snippet in Schritt 3. - Fügen Sie allen Quelldateien
import org.tensorflow.lite.InterpreterApi;
undimport org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
mit den Klassenorg.tensorflow.lite.Interpreter
oderorg.tensorflow.lite.InterpreterApi
hinzu. - Wenn einer der resultierenden Aufrufe von
InterpreterApi.create()
nur ein einziges Argument hat, fügen Sie der Argumentlistenew InterpreterApi.Options()
hinzu. - Hängen Sie
.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
an das letzte Argument von an: alle Aufrufe vonInterpreterApi.create()
. - Ersetzen Sie alle anderen Vorkommen der Klasse
org.tensorflow.lite.Interpreter
durchorg.tensorflow.lite.InterpreterApi
.
Wenn Sie die eigenständige LiteRT API und die Play Services API verwenden möchten nebeneinander ausführen, müssen Sie LiteRT 2.9 (oder höher) verwenden. LiteRT 2.8 und frühere Versionen sind nicht mit der Play-Dienste API-Version kompatibel.