TensorFlow Lite w Javie w Usługach Google Play

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:

  1. 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'
    
  2. 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());
        
  3. Włącz delegowanie GPU w opcjach interpretera: ustaw fabrykę delegacji na GpuDelegateFactory, wywołując addDelegateFactory() withinInterpreterApi.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:

  1. Zapoznaj się z sekcją Ograniczenia na tej stronie, aby upewnić się, że Twój przypadek użycia jest obsługiwany.
  2. 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ą.
  3. 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.
  4. 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.
  5. Dodaj import org.tensorflow.lite.InterpreterApi; i import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; do plików źródłowych za pomocą klas org.tensorflow.lite.Interpreter lub org.tensorflow.lite.InterpreterApi.
  6. Jeśli dowolne z wynikowych wywołań funkcji InterpreterApi.create() ma tylko 1 argument, do listy argumentów dołącz new InterpreterApi.Options().
  7. Dołącz .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) do ostatniego argumentu dowolnych wywołań funkcji InterpreterApi.create().
  8. 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.