Dostęp do TensorFlow Lite w Usługach Google Play można też uzyskać przez interfejsy Native API za pomocą interfejsów API w Javie. Platforma TensorFlow Lite w usługach Google Play jest dostępna w szczególności przez TensorFlow Lite Interpreter API.
Korzystanie z interfejsów API tłumaczenia rozmowy
Interfejs TensorFlow Lite Interpreter API udostępniany w środowisku wykonawczym TensorFlow to interfejs ogólnego przeznaczenia do tworzenia i uruchamiania modeli ML. Wykonaj te czynności, aby uruchomić wnioskowanie za pomocą interfejsu Interpreter API za pomocą TensorFlow Lite w środowisku wykonawczym Usług Google Play.
1. Dodaj zależności projektu
Dodaj te zależności do kodu projektu aplikacji, aby uzyskać dostęp do interfejsu Play Services API dla TensorFlow Lite:
dependencies {
...
// Tensorflow Lite dependencies for Google Play services
implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
// Optional: include Tensorflow Lite Support Library
implementation 'com.google.android.gms:play-services-tflite-support:16.0.1'
...
}
2. Dodaj inicjowanie TensorFlow Lite
Przed użyciem interfejsów API TensorFlow Lite zainicjuj komponent TensorFlow Lite interfejsu Google Play Services API:
Kotlin
val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }
Java
Task<Void> initializeTask = TfLite.initialize(context);
3. Tworzenie tłumaczenia rozmowy i ustawianie opcji środowiska wykonawczego
Utwórz interpreter w usłudze InterpreterApi.create()
i skonfiguruj go pod kątem środowiska wykonawczego Usług Google Play, wywołując InterpreterApi.Options.setRuntime()
, jak pokazano w tym przykładowym kodzie:
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())); });
Użyj powyższej implementacji, ponieważ pozwoli to uniknąć zablokowania wątku interfejsu Androida. Jeśli chcesz ściślej zarządzać wykonywaniem wątków, możesz dodać wywołanie Tasks.await()
do tworzenia tłumaczenia rozmowy:
Kotlin
import androidx.lifecycle.lifecycleScope ... lifecycleScope.launchWhenStarted { // uses coroutine initializeTask.await() }
Java
@BackgroundThread InterpreterApi initializeInterpreter() { Tasks.await(initializeTask); return InterpreterApi.create(...); }
4. Przeprowadź wnioskowanie
Za pomocą utworzonego obiektu interpreter
wywołaj metodę run()
, aby wygenerować wnioskowanie.
Kotlin
interpreter.run(inputBuffer, outputBuffer)
Java
interpreter.run(inputBuffer, outputBuffer);
Akceleracja sprzętowa
TensorFlow Lite pozwala przyspieszyć wydajność modelu za pomocą specjalistycznych procesorów sprzętowych, takich jak procesory graficzne (GPU). Te specjalistyczne procesory można wykorzystać dzięki sterownikom sprzętowym nazywanym przekazaniem dostępu.
Delegat do procesora graficznego jest dostarczany przez Usługi Google Play i wczytywany dynamicznie, podobnie jak wersje interfejsu interpreter API w usługach Play.
Sprawdzam zgodność urządzenia
Nie wszystkie urządzenia obsługują akcelerację sprzętową GPU za pomocą TFLite. Aby ograniczyć błędy i potencjalne awarie, używaj metody TfLiteGpu.isGpuDelegateAvailable
do sprawdzania, czy urządzenie jest zgodne z delegatem GPU.
Ta metoda pozwala sprawdzić, czy urządzenie jest zgodne z GPU, i użyj jej jako opcji zastępczej, gdy GPU nie jest obsługiwane.
useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)
Gdy masz zmienną taką jak useGpuTask
, możesz jej używać do określania, czy urządzenia korzystają z delegata GPU.
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; });
Procesor graficzny z interfejsami API tłumaczenia rozmowy
Aby korzystać z przekazywania GPU w interfejsach API tłumaczenia rozmowy:
Zaktualizuj zależności projektu, aby korzystać z delegata GPU z Usług Play:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
Włącz opcję przekazywania GPU w inicjowaniu TFlite:
Kotlin
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Java
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
Włącz delegowanie GPU w opcjach interpretera: ustaw fabrykę delegacji na GpuDelegateFactory, wywołując
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());
Migracja z samodzielnego środowiska TensorFlow Lite
Jeśli planujesz migrację aplikacji z samodzielnego TensorFlow Lite do interfejsu Play Services API, zapoznaj się z tymi dodatkowymi wskazówkami dotyczącymi aktualizowania kodu projektu aplikacji:
- Zapoznaj się z sekcją Ograniczenia na tej stronie, aby upewnić się, że Twój przypadek użycia jest obsługiwany.
- Zanim zaktualizujesz kod, przeprowadź kontrolę wydajności i dokładności swoich modeli, zwłaszcza jeśli korzystasz z wersji TensorFlow Lite starszych niż 2.1. Pozwoli Ci to uzyskać punkt odniesienia do porównania z nową implementacją.
- Jeśli udało Ci się przenieść cały kod, aby korzystać z interfejsu Play Services API w TensorFlow Lite, musisz usunąć z pliku build.gradle istniejące zależności biblioteki środowiska wykonawczego TensorFlow Lite (wpisy z
org.tensorflow:tensorflow-lite:*
), aby zmniejszyć rozmiar aplikacji. - Zidentyfikuj w kodzie wszystkie wystąpienia tworzenia obiektu
new Interpreter
i zmodyfikuj je tak, aby wykorzystywało wywołanie InterpreterApi.create(). Nowy TfLite.initialize jest asynchroniczny, co oznacza, że w większości przypadków nie jest zamiennikiem. Musisz zarejestrować odbiornik, aby umożliwić działanie odbiornika na czas zakończenia wywołania. Zobacz fragment kodu z kroku 3. - Dodaj
import org.tensorflow.lite.InterpreterApi;
iimport org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
do plików źródłowych za pomocą klasorg.tensorflow.lite.Interpreter
luborg.tensorflow.lite.InterpreterApi
. - Jeśli dowolne z wynikowych wywołań funkcji
InterpreterApi.create()
ma tylko 1 argument, do listy argumentów dołącznew InterpreterApi.Options()
. - Dołącz
.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
do ostatniego argumentu dowolnych wywołań funkcjiInterpreterApi.create()
. - Zastąp wszystkie inne wystąpienia klasy
org.tensorflow.lite.Interpreter
wartościąorg.tensorflow.lite.InterpreterApi
.
Jeśli chcesz korzystać jednocześnie z autonomicznego TensorFlow Lite i interfejsu Play Services API, musisz użyć TensorFlow Lite 2.9 (lub nowszej wersji). Wersje TensorFlow Lite 2.8 i starsze nie są zgodne z wersją interfejsu Play Services API.