LiteRT در Google Play Services Java (و Kotlin) API

LiteRT در سرویس‌های Google Play همچنین می‌تواند با استفاده از APIهای جاوا، که علاوه بر Native API، از کد جاوا یا Kotlin استفاده می‌شوند، نیز دسترسی داشته باشد. به طور خاص، LiteRT در خدمات Google Play از طریق LiteRT Interpreter API در دسترس است.

استفاده از Interpreter API

LiteRT Interpreter API که توسط TensorFlow Runtime ارائه شده است، یک رابط همه منظوره برای ساخت و اجرای مدل های ML فراهم می کند. از مراحل زیر برای اجرای استنباط با Interpreter API با استفاده از TensorFlow Lite در زمان اجرا خدمات Google Play استفاده کنید.

1. وابستگی های پروژه را اضافه کنید

برای دسترسی به API خدمات Play برای LiteRT، وابستگی‌های زیر را به کد پروژه برنامه خود اضافه کنید:

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 را اضافه کنید

قبل از استفاده از LiteRT APIهای خدمات Google Play، جزء LiteRT را راه‌اندازی کنید:

کاتلین

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

جاوا

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

3. یک مترجم ایجاد کنید و گزینه زمان اجرا را تنظیم کنید

یک مفسر با استفاده از InterpreterApi.create() ایجاد کنید و آن را برای استفاده از زمان اجرا سرویس های Google Play، با فراخوانی InterpreterApi.Options.setRuntime() پیکربندی کنید، همانطور که در کد مثال زیر نشان داده شده است:

کاتلین

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

جاوا

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

شما باید از پیاده سازی بالا استفاده کنید زیرا از مسدود کردن رشته رابط کاربری اندروید جلوگیری می کند. اگر نیاز به مدیریت دقیق‌تر اجرای رشته دارید، می‌توانید یک فراخوانی Tasks.await() به ایجاد مفسر اضافه کنید:

کاتلین

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

جاوا

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

4. استنتاج ها را اجرا کنید

با استفاده از شی interpreter که ایجاد کردید، متد run() را برای ایجاد استنتاج فراخوانی کنید.

کاتلین

interpreter.run(inputBuffer, outputBuffer)

جاوا

interpreter.run(inputBuffer, outputBuffer);

شتاب سخت افزاری

LiteRT به شما امکان می دهد با استفاده از پردازنده های سخت افزاری تخصصی مانند واحدهای پردازش گرافیکی (GPU) عملکرد مدل خود را تسریع کنید. شما می توانید با استفاده از درایورهای سخت افزاری به نام delegates از این پردازنده های تخصصی بهره ببرید.

نماینده GPU از طریق خدمات Google Play ارائه می شود و به صورت پویا بارگیری می شود، درست مانند نسخه های خدمات Play Interpreter API.

بررسی سازگاری دستگاه

همه دستگاه ها از شتاب سخت افزاری GPU با TFLite پشتیبانی نمی کنند. به منظور کاهش خطاها و خرابی‌های احتمالی، از روش TfLiteGpu.isGpuDelegateAvailable برای بررسی سازگاری دستگاه با نماینده GPU استفاده کنید.

از این روش برای تأیید سازگاری دستگاه با GPU استفاده کنید، و از CPU به عنوان جایگزین برای زمانی که GPU پشتیبانی نمی شود استفاده کنید.

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

هنگامی که متغیری مانند useGpuTask دارید، می توانید از آن برای تعیین اینکه آیا دستگاه ها از نماینده GPU استفاده می کنند یا خیر استفاده کنید.

کاتلین

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

جاوا

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

GPU با Interpreter API

برای استفاده از نماینده GPU با Interpreter API:

  1. برای استفاده از نماینده GPU از خدمات Play، وابستگی های پروژه را به روز کنید:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
    
  2. گزینه GPU delegate را در مقداردهی اولیه TFlite فعال کنید:

    کاتلین

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

    جاوا

    TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build());
  3. فعال کردن نماینده GPU در گزینه های مفسر: با فراخوانی addDelegateFactory() within InterpreterApi.Options()` کارخانه delegate را روی GpuDelegateFactory تنظیم کنید:

    کاتلین

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

    جاوا

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

مهاجرت از LiteRT مستقل

اگر قصد دارید برنامه خود را از LiteRT مستقل به API خدمات Play منتقل کنید، راهنمایی های اضافی زیر را برای به روز رسانی کد پروژه برنامه خود مرور کنید:

  1. بخش محدودیت‌ها را در این صفحه مرور کنید تا مطمئن شوید که مورد استفاده شما پشتیبانی می‌شود.
  2. قبل از به‌روزرسانی کد، توصیه می‌کنیم بررسی‌های عملکرد و دقت مدل‌های خود را انجام دهید، به‌ویژه اگر از نسخه‌های LiteRT (TF Lite) زودتر از نسخه 2.1 استفاده می‌کنید، بنابراین یک خط پایه برای مقایسه با اجرای جدید دارید.
  3. اگر تمام کد خود را برای استفاده از API خدمات Play برای LiteRT منتقل کرده‌اید، باید وابستگی‌های کتابخانه زمان اجرا LiteRT (ورودی‌هایی با org.tensorflow: tensorflow-lite :* ) را از فایل build.gradle خود حذف کنید تا بتوانید کاهش دهید. اندازه برنامه شما
  4. همه موارد ایجاد شئ new Interpreter را در کد خود شناسایی کنید و هر کدام را طوری تغییر دهید که از فراخوانی InterpreterApi.create() استفاده کند. TfLite.initialize جدید ناهمزمان است، به این معنی که در بیشتر موارد جایگزینی کشویی نیست: شما باید برای زمانی که تماس کامل شود، شنونده ثبت کنید. به قطعه کد در کد مرحله 3 مراجعه کنید.
  5. افزودن import org.tensorflow.lite.InterpreterApi; و import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; به هر فایل منبعی با استفاده از کلاس های org.tensorflow.lite.Interpreter یا org.tensorflow.lite.InterpreterApi .
  6. اگر هر یک از فراخوانی‌های InterpreterApi.create() فقط یک آرگومان دارد، new InterpreterApi.Options() به لیست آرگومان اضافه کنید.
  7. .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) را به آخرین آرگومان هر فراخوانی به InterpreterApi.create() اضافه کنید.
  8. همه رخدادهای دیگر کلاس org.tensorflow.lite.Interpreter را با org.tensorflow.lite.InterpreterApi جایگزین کنید.

اگر می خواهید از LiteRT مستقل و API خدمات Play در کنار هم استفاده کنید، باید از LiteRT (TF Lite) نسخه 2.9 یا بالاتر استفاده کنید. LiteRT (TF Lite) نسخه 2.8 و نسخه های قبلی با نسخه API خدمات Play سازگار نیستند.