TensorFlow Lite در سرویس‌های Google Play Java API

TensorFlow Lite در سرویس‌های Google Play علاوه بر Native API با استفاده از Java API نیز قابل دسترسی است. به طور خاص، TensorFlow Lite در خدمات Google Play از طریق TensorFlow Lite Interpreter API در دسترس است.

استفاده از Interpreter API

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

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

برای دسترسی به API خدمات Play برای 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. مقداردهی اولیه TensorFlow Lite را اضافه کنید

قبل از استفاده از API های TensorFlow Lite، مؤلفه TensorFlow Lite را در API خدمات Google Play راه اندازی کنید:

کاتلین

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

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

TensorFlow Lite به شما امکان می دهد با استفاده از پردازنده های سخت افزاری تخصصی، مانند واحدهای پردازش گرافیکی (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.1.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());
    

مهاجرت از TensorFlow Lite مستقل

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

  1. بخش محدودیت‌ها را در این صفحه مرور کنید تا مطمئن شوید که مورد استفاده شما پشتیبانی می‌شود.
  2. قبل از به‌روزرسانی کد خود، بررسی‌های عملکرد و دقت مدل‌های خود را انجام دهید، به‌ویژه اگر از نسخه‌های TensorFlow Lite زودتر از نسخه ۲.۱ استفاده می‌کنید، بنابراین یک خط پایه برای مقایسه با اجرای جدید دارید.
  3. اگر تمام کد خود را برای استفاده از API خدمات Play برای TensorFlow Lite منتقل کرده‌اید، باید وابستگی‌های کتابخانه زمان اجرا TensorFlow Lite (ورودی‌هایی با 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 جایگزین کنید.

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