מתן גישה להאצה של GPU עם Translationer API

שימוש ביחידות עיבוד גרפיות (GPU) להרצת מודלים של למידת מכונה (ML) יכולה לשפר באופן משמעותי את הביצועים ואת חוויית המשתמש אפליקציות שתומכות בלמידת מכונה. במכשירי Android, אפשר להפעיל הענקת גישה ואחד מממשקי ה-API הבאים:

  • interpreer API – המדריך הזה
  • API מקורי (C/C++ ) - מדריך

בדף הזה נסביר איך להפעיל האצת GPU לדגמי LiteRT ב- אפליקציות ל-Android שמשתמשות ב-Translate API. למידע נוסף על השימוש ב-GPU להעביר נתונים ב-LiteRT, כולל שיטות מומלצות וטכניקות מתקדמות, עיינו בדף משתמשים שקיבלו הרשאה ל-GPU.

שימוש ב-GPU עם LiteRT עם Google Play Services

תרגום שיחה פעילה (LiteRT) API מספק קבוצה של ממשקי API לשימוש כללי לפיתוח אפליקציות של למידת מכונה. הקטע הזה מתארת את אופן השימוש בהאצלת GPU עם ממשקי ה-API האלה עם LiteRT עם Google Play Services.

מומלץ להשתמש ב-LiteRT עם Google Play Services נתיב לשימוש ב-LiteRT ב-Android. אם האפליקציה שלך מטרגטת מכשירים שלא מפעילות את Google Play, ראו GPU עם Translate API LiteRT.

מוסיפים יחסי תלות של פרויקט (באמצעות קטלוג הגרסאות של .toml)

  1. עדכון הקובץ libs.versions.toml של הפרויקט
[libraries]
...
tflite-gpu = { module = "com.google.ai.edge.litert:litert-gpu", version = "2.X.Y" }
tflite-gpu-api = { module = "com.google.ai.edge.litert:litert-gpu-api", version = "2.X.Y" }
...
  1. צריך להוסיף יחסי תלות של פרויקט ב-build.gradle.kts של האפליקציה
dependencies {
  ...
  implementation(libraries.tflite.gpu)
  implementation(libraries.tflite.gpu.api)
  ...
}

הוספת יחסי תלות של פרויקטים

כדי להפעיל גישה למקבל ההרשאה ל-GPU, צריך להוסיף com.google.android.gms:play-services-tflite-gpu ל-build.gradle של האפליקציה file:

dependencies {
    ...
    implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
}

הפעלה של האצת GPU

לאחר מכן, מאתחלים את LiteRT עם Google Play Services עם תמיכה ב-GPU:

Kotlin

val useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

val interpreterTask = useGpuTask.continueWith { useGpuTask ->
  TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
      .setEnableGpuDelegateSupport(useGpuTask.result)
      .build())
  }
        

Java

Task<boolean> useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context);

Task<Options> interpreterOptionsTask = useGpuTask.continueWith({ task ->
  TfLite.initialize(context,
  TfLiteInitializationOptions.builder()
    .setEnableGpuDelegateSupport(true)
    .build());
});
        

עכשיו אפשר לאתחל את המתרגם להעביר GpuDelegateFactory עד InterpreterApi.Options:

Kotlin

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

    val interpreter = InterpreterApi(model, options)

    // Run inference
    writeToInput(input)
    interpreter.run(input, output)
    readFromOutput(output)
      

Java

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

    Interpreter interpreter = new InterpreterApi(model, options);

    // Run inference
    writeToInput(input);
    interpreter.run(input, output);
    readFromOutput(output);
      

אפשר להשתמש בהרשאה ל-GPU גם באמצעות קישור מודלים של למידת מכונה ב-Android Studio. עבור מידע נוסף זמין במאמר יצירת ממשקי מודלים באמצעות מטא-נתונים.

שימוש ב-GPU עם LiteRT נפרד

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

הוספת יחסי תלות של פרויקטים

כדי להפעיל גישה למקבל ההרשאה ל-GPU, צריך להוסיף com.google.ai.edge.litert:litert-gpu-delegate-plugin לאפליקציה שלך קובץ build.gradle:

dependencies {
    ...
    implementation 'org.tensorflow:tensorflow-lite'
    implementation 'com.google.ai.edge.litert:litert-gpu-delegate-plugin'
}

הפעלה של האצת GPU

לאחר מכן, מריצים את LiteRT ב-GPU עם TfLiteDelegate. ב-Java אפשר לציין GpuDelegate עד Interpreter.Options.

Kotlin

      import org.tensorflow.lite.Interpreter
      import org.tensorflow.lite.gpu.CompatibilityList
      import org.tensorflow.lite.gpu.GpuDelegate

      val compatList = CompatibilityList()

      val options = Interpreter.Options().apply{
          if(compatList.isDelegateSupportedOnThisDevice){
              // if the device has a supported GPU, add the GPU delegate
              val delegateOptions = compatList.bestOptionsForThisDevice
              this.addDelegate(GpuDelegate(delegateOptions))
          } else {
              // if the GPU is not supported, run on 4 threads
              this.setNumThreads(4)
          }
      }

      val interpreter = Interpreter(model, options)

      // Run inference
      writeToInput(input)
      interpreter.run(input, output)
      readFromOutput(output)
      

Java

      import org.tensorflow.lite.Interpreter;
      import org.tensorflow.lite.gpu.CompatibilityList;
      import org.tensorflow.lite.gpu.GpuDelegate;

      // Initialize interpreter with GPU delegate
      Interpreter.Options options = new Interpreter.Options();
      CompatibilityList compatList = CompatibilityList();

      if(compatList.isDelegateSupportedOnThisDevice()){
          // if the device has a supported GPU, add the GPU delegate
          GpuDelegate.Options delegateOptions = compatList.getBestOptionsForThisDevice();
          GpuDelegate gpuDelegate = new GpuDelegate(delegateOptions);
          options.addDelegate(gpuDelegate);
      } else {
          // if the GPU is not supported, run on 4 threads
          options.setNumThreads(4);
      }

      Interpreter interpreter = new Interpreter(model, options);

      // Run inference
      writeToInput(input);
      interpreter.run(input, output);
      readFromOutput(output);
      

מודלים כמותיים

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

השבתת התמיכה במודל כמותי

הקוד הבא מסביר איך להשבית את התמיכה במודלים כמותיים.

Java

GpuDelegate delegate = new GpuDelegate(new GpuDelegate.Options().setQuantizedModelsAllowed(false));

Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
      

למידע נוסף על הרצת מודלים כמותיים עם האצת GPU, ראו: סקירה כללית בנושא הענקת גישה ל-GPU.