نماینده شتاب پردازنده گرافیکی با C/C++ API

استفاده از واحدهای پردازش گرافیکی (GPU) برای اجرای مدل‌های یادگیری ماشینی (ML) می‌تواند عملکرد و تجربه کاربری برنامه‌های دارای ML را به‌طور چشمگیری بهبود بخشد. در دستگاه‌های Android، می‌توانید با استفاده از یک نماینده و یکی از APIهای زیر، اجرای مدل‌های خود را با سرعت GPU فعال کنید:

  • Interpreter API - راهنمای
  • Native (C/C++) API - این راهنما

این راهنما استفاده های پیشرفته از نماینده GPU برای C API، C++ API و استفاده از مدل های کوانتیزه را پوشش می دهد. برای اطلاعات بیشتر در مورد استفاده از نماینده GPU برای LiteRT، از جمله بهترین شیوه‌ها و تکنیک‌های پیشرفته، به صفحه نمایندگان GPU مراجعه کنید.

شتاب GPU را فعال کنید

با ایجاد delegate با TfLiteGpuDelegateV2Create() و از بین بردن آن با TfLiteGpuDelegateV2Delete() ، همانطور که در کد مثال زیر نشان داده شده است، از نماینده GPU LiteRT برای Android در C یا C++ استفاده کنید:

// 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 برای اندروید در 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 در Google Play Services C API استفاده می‌کنید، باید از Java/Kotlin API استفاده کنید تا قبل از راه‌اندازی زمان اجرا LiteRT بررسی کنید که آیا یک نماینده GPU برای دستگاه شما موجود است یا خیر.

وابستگی های Grale Delegate GPU را به برنامه خود اضافه کنید:

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

سپس، در دسترس بودن GPU را بررسی کنید و در صورت موفقیت آمیز بودن بررسی، TfLiteNative را مقداردهی اولیه کنید:

جاوا

Task<Void> 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);

مدل های کوانتیزه شده

کتابخانه های نمایندگی 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 مراجعه کنید.