TensorFlow Lite ב-Google Play Services Java API

אפשר לגשת ל-TensorFlow Lite ב-Google Play Services גם באמצעות ממשקי Java API, בנוסף ל-Native API. באופן ספציפי, TensorFlow Lite בשירותי Google Play זמין דרך TensorFlow Lite Translationer API.

שימוש בממשקי ה-API של תרגום שיחה פעילה

TensorFlow Lite Translation API, שסופק על ידי סביבת זמן הריצה של TensorFlow, מספק ממשק לשימוש כללי ליצירה ולהפעלה של מודלים של למידת מכונה. תוכלו לפעול לפי השלבים הבאים כדי להריץ הסקת מסקנות באמצעות Translationer API באמצעות TensorFlow Lite בסביבת זמן הריצה של Google Play Services.

‫1. הוספת יחסי תלות של פרויקט

כדי לגשת ל-Play Services API עבור 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

מפעילים את רכיב TensorFlow Lite ב-Google Play Services API לפני שמשתמשים בממשקי ה-API של TensorFlow Lite:

Kotlin

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

Java

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

3. יצירת תרגום שיחה והגדרת אפשרות זמן ריצה

יוצרים מתורגמן באמצעות InterpreterApi.create() ומגדירים אותו לשימוש בסביבת זמן ריצה של Google Play Services על ידי קריאה ל-InterpreterApi.Options.setRuntime(), כפי שמוצג בקוד לדוגמה הבא:

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

צריך להשתמש בהטמעה שלמעלה, כי היא מונעת חסימה של ה-thread של ממשק המשתמש ב-Android. אם אתם צריכים לנהל את הביצוע של השרשורים מקרוב, אתם יכולים להוסיף קריאה ל-Tasks.await() ליצירת המתורגמן:

Kotlin

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

Java

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

‫4. הרצת מסקנות

באמצעות האובייקט interpreter שיצרתם, קוראים לשיטה run() כדי ליצור הסקת.

Kotlin

interpreter.run(inputBuffer, outputBuffer)

Java

interpreter.run(inputBuffer, outputBuffer);

שיפור המהירות באמצעות חומרה

TensorFlow Lite מאפשר לך להאיץ את ביצועי המודל באמצעות מעבדי חומרה מיוחדים, כמו יחידות עיבוד גרפי (GPU). אתם יכולים להשתמש במעבדי המידע המיוחדים האלה באמצעות מנהלי התקנים של חומרה שנקראים נציגים.

הענקת גישה ל-GPU מסופקת באמצעות שירותי Google Play, ונטענת באופן דינמי, בדיוק כמו הגרסאות של שירותי Play ב-Translate API.

בדיקת תאימות המכשיר

לא כל המכשירים תומכים בהאצת חומרה של GPU עם TFLite. כדי לצמצם שגיאות וקריסות פוטנציאליות, כדאי להשתמש בשיטה TfLiteGpu.isGpuDelegateAvailable ולבדוק אם המכשיר תואם ל-GPU הענקת גישה.

כדאי להשתמש בשיטה הזו כדי לבדוק אם מכשיר תואם ל-GPU, ולהשתמש ב-CPU כחלופה למקרים שבהם אין תמיכה ב-GPU.

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

אחרי שיוצרים משתנה כמו useGpuTask, אפשר להשתמש בו כדי לקבוע אם מכשירים משתמשים בהאצלת GPU.

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

יחידת GPU עם ממשקי API של תרגום

כדי להשתמש בהאצלת GPU עם ממשקי API של תרגום:

  1. מעדכנים את יחסי התלות של הפרויקט כדי להשתמש בהענקת גישה ל-GPU מ-Play Services:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. הפעל את האפשרות 'הענקת גישה ל-GPU' באתחול TFlite:

    Kotlin

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

    Java

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build());
        
  3. הפעל את התכונה 'הענקת גישה ל-GPU' באפשרויות 'המפענח': מגדירים את מפעל הענקת הגישה ל-GpuDelegateQuota, על ידי קריאה ל-addDelegateFactory() withinTranslationerApi.Options()':

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

מעבר מ-TensorFlow Lite עצמאי

אם אתם מתכננים להעביר את האפליקציה מ-TensorFlow Lite העצמאי ל-Play Services API, כדאי לעיין בהנחיות הנוספות הבאות לעדכון הקוד של פרויקט האפליקציה:

  1. עיינו בקטע מגבלות בדף הזה כדי לוודא שיש תמיכה בתרחיש לדוגמה שלכם.
  2. לפני שמעדכנים את הקוד, כדאי לבדוק את הביצועים והדיוק של המודלים, במיוחד אם אתם משתמשים בגרסאות של TensorFlow Lite שקודמות לגרסה 2.1, כך שיהיה לכם בסיס להשוואה מול הגרסה החדשה.
  3. אם העברת את כל הקוד לשימוש ב-Play Services API עבור TensorFlow Lite, עליך להסיר את יחסי התלות הקיימים של ספריית ההרצה של TensorFlow Lite (ערכים עם org.tensorflow:tensorflow-lite:*) מקובץ ה-build.gradle, כדי להקטין את גודל האפליקציה.
  4. זהה את כל המופעים של יצירת אובייקט new Interpreter בקוד שלכם, ושנו כל אחד מהם כך שישתמש בקריאה intererApi.create() . ה-TfLite.Initialize החדש הוא אסינכרוני, כך שברוב המקרים לא מדובר בהחלפה תדירה: תצטרכו לרשום listenize עד שהשיחה תסתיים. מעיינים בקטע הקוד שבשלב 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 העצמאי וב-Play Services API זה לצד זה, יש להשתמש ב-TensorFlow Lite 2.9 (ואילך). TensorFlow Lite 2.8 וגרסאות קודמות לא תואמות לגרסת ה-API של Play Services.