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

Google Play Hizmetleri'ndeki LiteRT'ye, yerel API'ye ek olarak Java veya Kotlin kodundan kullanılabilen Java API'leri kullanılarak da erişilebilir. Özellikle, Google Play hizmetlerindeki LiteRT özelliği LiteRT Translateer API üzerinden 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 sağlar. Google Play Hizmetleri çalışma zamanında TensorFlow Lite'i kullanarak Interpreter API ile çıkarım çalıştırmak için aşağıdaki adımları uygulayın.

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

LiteRT için Play Hizmetleri API'sine erişmek üzere uygulama projenizin koduna 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 ilk başlatılmasını ekleme

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 çevirmen oluşturun ve aşağıdaki örnek kodda gösterildiği gibi InterpreterApi.Options.setRuntime() yöntemini ç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ü mesaj dizisinin engellenmesini önlediği için yukarıdaki uygulamayı kullanmanız gerekir. Konuk yürütmeyi daha yakından yönetmeniz gerekiyorsa yorumlayıcı oluşturma işlemine Tasks.await() çağrı ekleyebilirsiniz:

Kotlin

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

Java

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

4. Çıkarımlar yapma

Oluşturduğunuz interpreter nesnesini kullanarak, çıkarım oluşturmak için run() yöntemini çağırın.

Kotlin

interpreter.run(inputBuffer, outputBuffer)

Java

interpreter.run(inputBuffer, outputBuffer);

Donanım hızlandırma

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

GPU temsilcisi, Google Play Hizmetleri aracılığıyla sağlanır ve tıpkı 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 bir cihazın GPU temsilcisiyle uyumlu olup olmadığını kontrol etmek üzere TfLiteGpu.isGpuDelegateAvailable yöntemini kullanın.

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şken oluşturduktan sonra, 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;
});
    

Yorumlayıcı API'leri ile GPU

Çevirmen API'leriyle GPU yetki verilmişse kullanmak için:

  1. Play Hizmetleri'ndeki GPU yetkilendirmesini 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 temsilcisi 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()` çağrısını yaparak 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'ten taşıma

Uygulamanızı bağımsız LiteRT'den Play Services API'ye taşımayı planlıyorsanız uygulama proje kodunuzu güncellemek için aşağıdaki ek rehberleri inceleyin:

  1. Kullanım alanınızın desteklendiğinden emin olmak için bu sayfanın Sınırlılıklar 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ırmak için bir referans noktanız olur.
  3. LiteRT için Play Services API'yi kullanmak üzere kodunuzun tamamını taşıdıysanız build.gradle dosyanızdan mevcut LiteRT çalışma zamanı kitaplığı bağımlılıklarını (org.tensorflow:tensorflow-lite:* içeren girişler) kaldırmanız gerekir. Böylece uygulamanızın boyutunu küçültebilirsiniz.
  4. Kodunuzda new Interpreter nesnesi oluşturma işleminin tüm tekrarlarını tanımlayın ve her birini, InterpreterApi.create() çağrısını kullanacak şekilde değiştirin. Yeni TfLite.initialize asynkrondur. Diğer bir deyişle, ç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 çağrılardan herhangi biri yalnızca tek bir bağımsız değişkene sahipse new InterpreterApi.Options() bağımsız değişkenini bağımsız değişken listesine ekleyin.
  7. InterpreterApi.create() çağrılarının son bağımsız değişkenine .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) ekleyin.
  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'yi birlikte kullanmak istiyorsanız LiteRT (TF Lite) 2.9 veya sonraki bir sürümü kullanmanız gerekir. LiteRT (TF Lite) 2.8 ve önceki sürümler Play Services API sürümüyle uyumlu değildir.