נציג האצת GPU עם API של C/C++

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

  • Interpreter API - מדריך
  • API של ספריית משימות - מדריך
  • API מקורי (C/C++) - מדריך זה

מדריך זה מכסה שימושים מתקדמים של נציג ה-GPU עבור C API, C++ API, ושימוש במודלים כמותיים. למידע נוסף על השימוש ב-GPU Delegate עבור TensorFlow Lite, כולל שיטות עבודה מומלצות וטכניקות מתקדמות, עיין בדף נציגי GPU .

אפשר האצת GPU

השתמש ב-TensorFlow Lite GPU Delegate עבור Android ב-C או C++ על-ידי יצירת ה-Delegate עם TfLiteGpuDelegateV2Create() והשמדתו עם TfLiteGpuDelegateV2Delete() , כפי שמוצג בקוד הדוגמה הבא:

// Set up interpreter.
auto model = FlatBufferModel::BuildFromFile(model_path);
if (!model) return false;
ops::builtin::BuiltinOpResolver op_resolver;
std::unique_ptr<Interpreter> interpreter;
InterpreterBuilder(*model, op_resolver)(&interpreter);

// NEW: Prepare GPU delegate.
auto* delegate = TfLiteGpuDelegateV2Create(/*default options=*/nullptr);
if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;

// Run inference.
WriteToInputTensor(interpreter->typed_input_tensor<float>(0));
if (interpreter->Invoke() != kTfLiteOk) return false;
ReadFromOutputTensor(interpreter->typed_output_tensor<float>(0));

// NEW: Clean up.
TfLiteGpuDelegateV2Delete(delegate);

עיין בקוד האובייקט TfLiteGpuDelegateOptionsV2 כדי לבנות מופע נציג עם אפשרויות מותאמות אישית. אתה יכול לאתחל את אפשרויות ברירת המחדל עם TfLiteGpuDelegateOptionsV2Default() ולאחר מכן לשנות אותן לפי הצורך.

הנציג של TensorFlow Lite GPU עבור אנדרואיד ב-C או C++ משתמש במערכת הבנייה של Bazel . אתה יכול לבנות את הנציג באמצעות הפקודה הבאה:

bazel build -c opt --config android_arm64 tensorflow/lite/delegates/gpu:delegate                           # for static library
bazel build -c opt --config android_arm64 tensorflow/lite/delegates/gpu:libtensorflowlite_gpu_delegate.so  # for dynamic library

בעת קריאה ל- Interpreter::ModifyGraphWithDelegate() או Interpreter::Invoke() , למתקשר חייב להיות EGLContext בשרשור הנוכחי ויש לקרוא ל- Interpreter::Invoke() מאותו EGLContext . אם EGLContext לא קיים, הנציג יוצר אחד באופן פנימי, אבל אז עליך לוודא ש- Interpreter::Invoke() נקרא תמיד מאותו שרשור שבו נקרא Interpreter::ModifyGraphWithDelegate() .

עם TensorFlow Lite בשירותי Google Play:

אם אתה משתמש ב-TensorFlow Lite ב-Google Play Services C API , תצטרך להשתמש ב-Java/Kotlin API כדי לבדוק אם נציג GPU זמין עבור המכשיר שלך לפני אתחול זמן הריצה של TensorFlow Lite.

הוסף את התלות של נציגי ה-GPU ליישום שלך:

implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'

לאחר מכן, בדוק את זמינות ה-GPU ואתחול TfLiteNative אם הבדיקה הצליחה:

Java

Task tfLiteHandleTask =
TfLiteGpu.isGpuDelegateAvailable(this)
   .onSuccessTask(gpuAvailable -> {
      TfLiteInitializationOptions options =
        TfLiteInitializationOptions.builder()
          .setEnableGpuDelegateSupport(gpuAvailable).build();
        return TfLiteNative.initialize(this, options);
      }
    );
      

קוטלין

val tfLiteHandleTask = TfLiteGpu.isGpuDelegateAvailable(this)
    .onSuccessTask { gpuAvailable ->
        val options = TfLiteInitializationOptions.Builder()
            .setEnableGpuDelegateSupport(gpuAvailable)
            .build()
        TfLiteNative.initialize(this, options)
    }
        

עליך גם לעדכן את תצורת ה-CMake שלך ​​כך שתכלול את דגל המהדר TFLITE_USE_OPAQUE_DELEGATE :

add_compile_definitions(TFLITE_USE_OPAQUE_DELEGATE)

ספריית FlatBuffers משמשת להגדרת תוספי נציגים, לכן עליך להוסיף אותה לתלות של הקוד המקורי שלך. אתה יכול להשתמש בתצורת פרויקט CMake הרשמית באופן הבא:

target_include_directories(tflite-jni PUBLIC
        third_party/headers # flatbuffers
     ...)

אתה יכול גם פשוט לאגד את הכותרות לאפליקציה שלך.

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

#include "flatbuffers/flatbuffers.h"
#include "tensorflow/lite/acceleration/configuration/configuration_generated.h"

flatbuffers::FlatBufferBuilder fbb;
tflite::TFLiteSettingsBuilder builder(fbb);
const tflite::TFLiteSettings* tflite_settings =
    flatbuffers::GetTemporaryPointer(fbb, builder.Finish());

const TfLiteOpaqueDelegatePlugin* pluginCApi = TfLiteGpuDelegatePluginCApi();
TfLiteOpaqueDelegate* gpu_delegate = pluginCApi->create(tflite_settings);

דגמים כמותיים

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

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

הקוד הבא מראה כיצד להשבית תמיכה עבור מודלים כמותיים.

C++

TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default();
options.experimental_flags = TFLITE_GPU_EXPERIMENTAL_FLAGS_NONE;

auto* delegate = TfLiteGpuDelegateV2Create(options);
if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
      

למידע נוסף על הפעלת דגמים קוונטיים עם האצת GPU, ראה סקירת נציגי GPU .