مندوب تسريع GPU مع C/C++ API

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

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

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

تمكين تسريع GPU

استخدم مندوب TensorFlow Lite GPU لنظام 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 GPU لنظام 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 في Google Play Services C API ، فستحتاج إلى استخدام Java/Kotlin API للتحقق مما إذا كان مندوب GPU متاحًا لجهازك قبل تهيئة وقت تشغيل TensorFlow Lite.

أضف تبعيات مندوب GPU إلى تطبيقك:

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

بعد ذلك، تحقق من توفر وحدة معالجة الرسومات وقم بتهيئة TfLiteNative إذا نجح التحقق:

جافا

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. يشرح القسم التالي كيفية تعطيل الدعم الكمي لأغراض الاختبار أو الاختبار.

تعطيل دعم النموذج الكمي

يوضح التعليمة البرمجية التالية كيفية تعطيل دعم النماذج الكمية.

سي ++

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

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

لمزيد من المعلومات حول تشغيل النماذج الكمية مع تسريع GPU، راجع نظرة عامة على مندوب GPU .