Delegat do akceleracji GPU w przypadku interfejsu Interpreter API

Zastosowanie procesorów graficznych (GPU) do uruchamiania modeli systemów uczących się może znacznie zwiększyć wydajność i wygodę użytkowników aplikacji obsługujących systemy uczące się. Na urządzeniach z Androidem możesz włączyć osobę, której przekazano dostęp, oraz jeden z tych interfejsów API:

  • Interpreter API – ten przewodnik
  • Natywny interfejs API (C/C++) – przewodnik

Na tej stronie opisujemy, jak włączyć akcelerację GPU w przypadku modeli TensorFlow Lite w aplikacjach na Androida za pomocą interfejsu Interpreter API. Więcej informacji o korzystaniu z delegata GPU do TensorFlow Lite, w tym o sprawdzonych metodach i zaawansowanych technikach, znajdziesz na stronie delegatów GPU.

Używanie GPU z TensorFlow Lite w Usługach Google Play

Interfejs API interpretera TensorFlow Lite udostępnia zestaw interfejsów API ogólnego przeznaczenia do tworzenia aplikacji systemów uczących się. W tej sekcji opisujemy, jak korzystać z przedstawiciela akceleratora GPU z tymi interfejsami API w TensorFlow Lite w Usługach Google Play.

TensorFlow Lite z Usługami Google Play to zalecana ścieżka do korzystania z TensorFlow Lite na Androidzie. Jeśli Twoja aplikacja jest kierowana na urządzenia, na których nie działa Google Play, zapoznaj się z sekcją GPU z interfejsem Interpreter API oraz samodzielnym TensorFlow Lite.

Dodaj zależności projektu (z katalogiem wersji .toml)

  1. Zaktualizuj plik libs.versions.toml projektu
[libraries]
...
tflite-gpu = { module = "org.tensorflow:tensorflow-lite-gpu", version = "2.X.Y" }
tflite-gpu-api = { module = "org.tensorflow:tensorflow-lite-gpu-api", version = "2.X.Y" }
...
  1. Dodaj zależności projektu w pliku build.gradle.kts aplikacji
dependencies {
  ...
  implementation(libraries.tflite.gpu)
  implementation(libraries.tflite.gpu.api)
  ...
}

Dodaj zależności projektu

Aby włączyć dostęp do delegata GPU, dodaj com.google.android.gms:play-services-tflite-gpu do pliku build.gradle swojej aplikacji:

dependencies {
    ...
    implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
}

Włącz akcelerację GPU

Następnie zainicjuj TensorFlow Lite w Usługach Google Play z obsługą GPU:

Kotlin

val useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

val interpreterTask = useGpuTask.continueWith { useGpuTask ->
  TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
      .setEnableGpuDelegateSupport(useGpuTask.result)
      .build())
  }
        

Java

Task<boolean> useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context);

Task<Options> interpreterOptionsTask = useGpuTask.continueWith({ task ->
  TfLite.initialize(context,
  TfLiteInitializationOptions.builder()
    .setEnableGpuDelegateSupport(true)
    .build());
});
        

Na koniec możesz zainicjować tłumaczenie, które przekazuje kod GpuDelegateFactory przez InterpreterApi.Options:

Kotlin


    val options = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
      .addDelegateFactory(GpuDelegateFactory())

    val interpreter = InterpreterApi(model, options)

    // Run inference
    writeToInput(input)
    interpreter.run(input, output)
    readFromOutput(output)
      

Java


    Options options = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
      .addDelegateFactory(new GpuDelegateFactory());

    Interpreter interpreter = new InterpreterApi(model, options);

    // Run inference
    writeToInput(input);
    interpreter.run(input, output);
    readFromOutput(output);
      

Delegata GPU można też używać z powiązaniem modelu ML w Android Studio. Więcej informacji znajdziesz w artykule Generowanie interfejsów modelu za pomocą metadanych.

Używaj GPU z samodzielnym TensorFlow Lite

Jeśli Twoja aplikacja jest kierowana na urządzenia, na których nie działa Google Play, możesz połączyć delegata GPU do swojej aplikacji i używać jej z samodzielną wersją TensorFlow Lite.

Dodaj zależności projektu

Aby włączyć dostęp do delegata GPU, dodaj org.tensorflow:tensorflow-lite-gpu-delegate-plugin do pliku build.gradle swojej aplikacji:

dependencies {
    ...
    implementation 'org.tensorflow:tensorflow-lite'
    implementation 'org.tensorflow:tensorflow-lite-gpu-delegate-plugin'
}

Włącz akcelerację GPU

Następnie uruchom TensorFlow Lite na GPU z TfLiteDelegate. W Javie możesz określić GpuDelegate do Interpreter.Options.

Kotlin

      import org.tensorflow.lite.Interpreter
      import org.tensorflow.lite.gpu.CompatibilityList
      import org.tensorflow.lite.gpu.GpuDelegate

      val compatList = CompatibilityList()

      val options = Interpreter.Options().apply{
          if(compatList.isDelegateSupportedOnThisDevice){
              // if the device has a supported GPU, add the GPU delegate
              val delegateOptions = compatList.bestOptionsForThisDevice
              this.addDelegate(GpuDelegate(delegateOptions))
          } else {
              // if the GPU is not supported, run on 4 threads
              this.setNumThreads(4)
          }
      }

      val interpreter = Interpreter(model, options)

      // Run inference
      writeToInput(input)
      interpreter.run(input, output)
      readFromOutput(output)
      

Java

      import org.tensorflow.lite.Interpreter;
      import org.tensorflow.lite.gpu.CompatibilityList;
      import org.tensorflow.lite.gpu.GpuDelegate;

      // Initialize interpreter with GPU delegate
      Interpreter.Options options = new Interpreter.Options();
      CompatibilityList compatList = CompatibilityList();

      if(compatList.isDelegateSupportedOnThisDevice()){
          // if the device has a supported GPU, add the GPU delegate
          GpuDelegate.Options delegateOptions = compatList.getBestOptionsForThisDevice();
          GpuDelegate gpuDelegate = new GpuDelegate(delegateOptions);
          options.addDelegate(gpuDelegate);
      } else {
          // if the GPU is not supported, run on 4 threads
          options.setNumThreads(4);
      }

      Interpreter interpreter = new Interpreter(model, options);

      // Run inference
      writeToInput(input);
      interpreter.run(input, output);
      readFromOutput(output);
      

Modele kwantyzowane

Biblioteki delegowania GPU w Androidzie domyślnie obsługują modele poddane kwantyzacji. Aby używać skwantyzowanych modeli z delegatem GPU, nie musisz wprowadzać żadnych zmian w kodzie. W sekcji poniżej wyjaśniono, jak wyłączyć obsługę ilościową na potrzeby testowania lub eksperymentu.

Wyłącz obsługę modelu skwantyzowanego

Poniższy kod pokazuje, jak wyłączyć obsługę modeli skwantyzowanych.

Java

GpuDelegate delegate = new GpuDelegate(new GpuDelegate.Options().setQuantizedModelsAllowed(false));

Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
      

Więcej informacji o uruchamianiu modeli skwantyzowanych z akceleracją GPU znajdziesz w artykule o przekazywaniu delegacji GPU.