Google Play Hizmetleri Java (ve Kotlin) API'sinde LiteRT

Google Play Hizmetleri'ndeki LiteRT'ye, Native API'ye ek olarak Java veya Kotlin kodundan kullanılabilen Java API'leri aracılığıyla da erişilebilir. Özellikle, Google Play Hizmetleri'ndeki LiteRT, LiteRT Interpreter API aracılığıyla kullanılabilir.

Çevirmen API'lerini kullanma

TensorFlow çalışma zamanı tarafından sağlanan LiteRT Interpreter API, ML modelleri oluşturmak ve çalıştırmak için genel amaçlı bir arayüz sunar. Google Play Hizmetleri çalışma zamanında TensorFlow Lite'ı kullanarak Interpreter API ile çıkarım çalıştırmak için aşağıdaki adımları uygulayın.

1. Proje bağımlılıkları ekleme

LiteRT için Play Hizmetleri API'sine erişmek üzere uygulama projesi kodunuza aşağıdaki bağımlılıkları ekleyin:

dependencies {
...
    // LiteRT dependencies for Google Play services
    implementation 'com.google.android.gms:play-services-tflite-java:16.1.0'
    // Optional: include LiteRT Support Library
    implementation 'com.google.android.gms:play-services-tflite-support:16.1.0'
...
}

2. LiteRT'nin başlatılmasını ekleyin

LiteRT API'lerini kullanmadan önce Google Play Hizmetleri API'sinin LiteRT bileşenini başlatın:

Kotlin

val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }

Java

Task<Void> initializeTask = TfLite.initialize(context);

3. Yorumlayıcı oluşturma ve çalışma zamanı seçeneğini ayarlama

InterpreterApi.create() kullanarak bir yorumlayıcı oluşturun ve aşağıdaki örnek kodda gösterildiği gibi InterpreterApi.Options.setRuntime() işlevini çağırarak Google Play Hizmetleri çalışma zamanını kullanacak şekilde yapılandırın:

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()));
  });

Android kullanıcı arayüzü iş parçacığının engellenmesini önlediği için yukarıdaki uygulamayı kullanmanız gerekir. İş parçacığı yürütme işlemini daha yakından yönetmeniz gerekiyorsa yorumlayıcı oluşturma işlemine Tasks.await() çağrısı ekleyebilirsiniz:

Kotlin

import androidx.lifecycle.lifecycleScope
...
lifecycleScope.launchWhenStarted { // uses coroutine
  initializeTask.await()
}

Java

@BackgroundThread
InterpreterApi initializeInterpreter() {
    Tasks.await(initializeTask);
    return InterpreterApi.create(...);
}

4. Çıkarım çalıştırma

Oluşturduğunuz interpreter nesnesini kullanarak run() yöntemini çağırıp bir çıkarım oluşturun.

Kotlin

interpreter.run(inputBuffer, outputBuffer)

Java

interpreter.run(inputBuffer, outputBuffer);

Donanım hızlandırma

LiteRT, grafik işleme birimleri (GPU'lar) gibi özel donanım işlemcileri kullanarak modelinizin performansını hızlandırmanıza olanak tanır. Temsilciler adı verilen donanım sürücülerini kullanarak bu özel işlemcilerden yararlanabilirsiniz.

GPU temsilcisi, Google Play Hizmetleri aracılığıyla sağlanır ve Interpreter API'nin Play Hizmetleri sürümleri gibi dinamik olarak yüklenir.

Cihaz uyumluluğunu kontrol etme

Bazı cihazlar, TFLite ile GPU donanım hızlandırmayı desteklemez. Hataları ve olası kilitlenmeleri azaltmak için TfLiteGpu.isGpuDelegateAvailable yöntemini kullanarak bir cihazın GPU temsilcisiyle uyumlu olup olmadığını kontrol edin.

Bir cihazın GPU ile uyumlu olup olmadığını onaylamak için bu yöntemi kullanın ve GPU desteklenmediğinde yedek olarak CPU'yu kullanın.

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

useGpuTask gibi bir değişkeniniz olduğunda, cihazların GPU temsilcisini kullanıp kullanmadığını belirlemek için bu değişkeni kullanabilirsiniz.

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;
});
    

Interpreter API'leri ile GPU

GPU temsilcisini Interpreter API'leriyle kullanmak için:

  1. Play Hizmetleri'ndeki GPU temsilcisini kullanmak için proje bağımlılıklarını güncelleyin:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
    
  2. TFlite başlatma işleminde GPU temsilci seçeneğini etkinleştirin:

    Kotlin

    TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build())

    Java

    TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build());
  3. Yorumlayıcı seçeneklerinde GPU temsilcisini etkinleştirin: addDelegateFactory() withinInterpreterApi.Options()` işlevini çağırarak temsilci fabrikasını GpuDelegateFactory olarak ayarlayın:

    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());

Bağımsız LiteRT'den taşıma

Uygulamanızı bağımsız LiteRT'den Play Hizmetleri API'sine taşımayı planlıyorsanız uygulama projesi kodunuzu güncellemek için aşağıdaki ek kılavuzu inceleyin:

  1. Kullanım alanınızın desteklendiğinden emin olmak için Sınırlamalar bölümünü inceleyin.
  2. Kodunuzu güncellemeden önce, özellikle LiteRT'nin (TF Lite) 2.1 sürümünden önceki sürümlerini kullanıyorsanız modelleriniz için performans ve doğruluk kontrolleri yapmanızı öneririz. Böylece, yeni uygulamayla karşılaştırabileceğiniz bir temel oluşturabilirsiniz.
  3. Kodunuzun tamamını LiteRT için Play Hizmetleri API'sini kullanacak şekilde taşıdıysanız uygulama boyutunuzu küçültmek için mevcut LiteRT çalışma zamanı kitaplığı bağımlılıklarını (org.tensorflow:tensorflow-lite:* içeren girişler) build.gradle dosyanızdan kaldırmanız gerekir.
  4. Kodunuzda new Interpreter nesne oluşturma işlemlerinin tümünü belirleyin ve her birini InterpreterApi.create() çağrısını kullanacak şekilde değiştirin. Yeni TfLite.initialize işlevi eşzamansızdır. Bu nedenle, çoğu durumda doğrudan değiştirilemez. Arama tamamlandığında bir dinleyici kaydetmeniz gerekir. 3. adım kodundaki kod snippet'ine bakın.
  5. org.tensorflow.lite.Interpreter veya org.tensorflow.lite.InterpreterApi sınıflarını kullanarak herhangi bir kaynak dosyaya import org.tensorflow.lite.InterpreterApi; ve import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; ekleyin.
  6. InterpreterApi.create() işlevine yapılan ve tek bağımsız değişken içeren tüm çağrılarda bağımsız değişken listesine new InterpreterApi.Options() ekleyin.
  7. .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY), InterpreterApi.create() ile yapılan tüm çağrıların son bağımsız değişkenine eklenir.
  8. org.tensorflow.lite.Interpreter sınıfının diğer tüm örneklerini org.tensorflow.lite.InterpreterApi ile değiştirin.

Bağımsız LiteRT ve Play Hizmetleri API'sini yan yana kullanmak istiyorsanız LiteRT (TF Lite) 2.9 veya sonraki bir sürümünü kullanmanız gerekir. LiteRT (TF Lite) 2.8 sürümü ve önceki sürümleri, Play Hizmetleri API sürümüyle uyumlu değildir.