אפשר לגשת ל-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 של תרגום:
מעדכנים את יחסי התלות של הפרויקט כדי להשתמש בהענקת גישה ל-GPU מ-Play Services:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
הפעל את האפשרות 'הענקת גישה ל-GPU' באתחול TFlite:
Kotlin
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Java
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
הפעל את התכונה 'הענקת גישה ל-GPU' באפשרויות 'המפענח': מגדירים את מפעל הענקת הגישה ל-GpuDelegateQuota, על ידי קריאה ל-
addDelegateFactory() within
TranslationerApi.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, כדאי לעיין בהנחיות הנוספות הבאות לעדכון הקוד של פרויקט האפליקציה:
- עיינו בקטע מגבלות בדף הזה כדי לוודא שיש תמיכה בתרחיש לדוגמה שלכם.
- לפני שמעדכנים את הקוד, כדאי לבדוק את הביצועים והדיוק של המודלים, במיוחד אם אתם משתמשים בגרסאות של TensorFlow Lite שקודמות לגרסה 2.1, כך שיהיה לכם בסיס להשוואה מול הגרסה החדשה.
- אם העברת את כל הקוד לשימוש ב-Play Services API עבור TensorFlow Lite, עליך להסיר את יחסי התלות הקיימים של ספריית ההרצה של TensorFlow Lite (ערכים עם
org.tensorflow:tensorflow-lite:*
) מקובץ ה-build.gradle, כדי להקטין את גודל האפליקציה. - זהה את כל המופעים של יצירת אובייקט
new Interpreter
בקוד שלכם, ושנו כל אחד מהם כך שישתמש בקריאה intererApi.create() . ה-TfLite.Initialize החדש הוא אסינכרוני, כך שברוב המקרים לא מדובר בהחלפה תדירה: תצטרכו לרשום listenize עד שהשיחה תסתיים. מעיינים בקטע הקוד שבשלב 3. - מוסיפים את
import org.tensorflow.lite.InterpreterApi;
ו-import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
לקובצי המקור באמצעות המחלקותorg.tensorflow.lite.Interpreter
אוorg.tensorflow.lite.InterpreterApi
. - אם לקריאות שהתקבלו ב-
InterpreterApi.create()
יש רק ארגומנט אחד, הוסיפו אתnew InterpreterApi.Options()
לרשימת הארגומנטים. - מוסיפים את
.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
לארגומנט האחרון של כל הקריאות ל-InterpreterApi.create()
. - מחליפים את כל שאר המופעים של המחלקה
org.tensorflow.lite.Interpreter
ב-org.tensorflow.lite.InterpreterApi
.
כדי להשתמש ב-TensorFlow Lite העצמאי וב-Play Services API זה לצד זה, יש להשתמש ב-TensorFlow Lite 2.9 (ואילך). TensorFlow Lite 2.8 וגרסאות קודמות לא תואמות לגרסת ה-API של Play Services.