تفويض تسريع وحدة معالجة الرسومات باستخدام واجهة برمجة التطبيقات C/C++

يمكن أن يؤدي استخدام وحدات معالجة الرسومات (GPU) لتشغيل نماذج تعلُّم الآلة (ML) إلى تحسين الأداء وتجربة المستخدم بشكل كبير في التطبيقات التي تعتمد على تعلُّم الآلة. على أجهزة Android، يمكنك تفعيل تنفيذ نماذجك باستخدام وحدة معالجة الرسومات المُسرّعة من خلال تفويض وأحد واجهات برمجة التطبيقات التالية:

  • واجهة برمجة التطبيقات الخاصة بميزة "الترجمة الفورية" - دليل
  • واجهة برمجة التطبيقات الأصلية (C/C++ ) - هذا الدليل

يتناول هذا الدليل الاستخدامات المتقدمة لمفوض وحدة معالجة الرسومات في واجهة برمجة التطبيقات C API وC++ API واستخدام النماذج الكمية. لمزيد من المعلومات حول استخدام المفوَّض الخاص بوحدة معالجة الرسومات TensorFlow Lite، بما في ذلك أفضل الممارسات والتقنيات المتقدمة، راجِع صفحة مفوَّضي وحدة معالجة الرسومات.

تفعيل ميزة "تسريع وحدة معالجة الرسومات"

يمكنك استخدام مفوَّض وحدة معالجة الرسومات TensorFlow Lite لنظام التشغيل Android في C أو C++ من خلال إنشاء التفويض مع 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 لنظام التشغيل Android في لغة 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 في C API لخدمات Google Play، عليك استخدام واجهة برمجة التطبيقات Java/Kotlin API للتحقّق من توفّر تفويض وحدة معالجة الرسومات لجهازك قبل ضبط وقت تشغيل TensorFlow Lite.

إضافة تبعيات لمفوض وحدة معالجة الرسومات إلى تطبيقك:

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

بعد ذلك، تحقَّق من مدى توفّر وحدة معالجة الرسومات وقدِّم إعدادات TfLiteNative في حال نجحت عملية التحقّق:

Java

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

Kotlin

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

يمكنك أيضًا تجميع العناوين في تطبيقك فقط.

أخيرًا، لاستخدام استنتاج وحدة معالجة الرسومات في الرمز C، أنشئ تفويضًا لوحدة معالجة الرسومات باستخدام 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 مع النماذج الكمية تلقائيًا. ولن تضطر إلى إجراء أي تغييرات على الرمز لاستخدام نماذج الكمية مع تفويض وحدة معالجة الرسومات. يوضح القسم التالي كيفية إيقاف الدعم الكمي لأغراض الاختبار أو التجربة.

إيقاف إتاحة النموذج الكمي

يوضّح الرمز التالي كيفية إيقاف إتاحة النماذج الكمية.

C++

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

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

لمزيد من المعلومات عن تشغيل نماذج الكمية باستخدام تسريع وحدة معالجة الرسومات، يُرجى الاطّلاع على نظرة عامة على تفويض وحدة معالجة الرسومات.