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

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

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

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

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

استخدم تفويض وحدة معالجة الرسومات LiteRT لنظام التشغيل 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() ثم عدِّلها حسب الضرورة.

يستخدم تفويض وحدة معالجة الرسومات LiteRT لنظام التشغيل 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() فيها.

عند استخدام LiteRT في "خدمات Google Play":

في حال استخدام LiteRT في واجهة برمجة التطبيقات C API في "خدمات Google Play"، عليك اتّباع الخطوات التالية: ستحتاج إلى استخدام واجهة برمجة تطبيقات Java/Kotlin للتحقق مما إذا كان هناك تفويض باستخدام وحدة معالجة الرسومات. لجهازك قبل تهيئة بيئة تشغيل LiteRT.

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

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

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

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

C++‎

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

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

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