มอบสิทธิ์การเร่งความเร็วของ GPU ด้วย C/C++ API

การใช้หน่วยประมวลผลกราฟิก (GPU) เพื่อเรียกใช้โมเดลแมชชีนเลิร์นนิง (ML) จะช่วยปรับปรุงประสิทธิภาพและประสบการณ์ของผู้ใช้ แอปพลิเคชันที่รองรับ ML ในอุปกรณ์ Android คุณสามารถเปิดใช้การเร่งการแสดงผลด้วย GPU การดำเนินการโมเดลของคุณโดยใช้ตัวแทนและ API ต่อไปนี้

  • Interpreter API - คู่มือ
  • API แบบเนทีฟ (C/C++) - คู่มือนี้

คู่มือนี้ครอบคลุมการใช้งานขั้นสูงของการมอบสิทธิ์ GPU สำหรับ C API, C++ API และ การใช้โมเดลที่เล็กลง ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้การมอบสิทธิ์ GPU สำหรับ LiteRT รวมถึงแนวทางปฏิบัติที่ดีที่สุดและเทคนิคขั้นสูง โปรดดู GPU ผู้รับมอบสิทธิ์

เปิดใช้การเร่ง GPU

ใช้การมอบสิทธิ์ LiteRT 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() แล้วแก้ไขตามความจำเป็น

ผู้รับมอบสิทธิ์ LiteRT 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 ผู้รับมอบสิทธิ์จะสร้าง 1 รายการเป็นการภายใน แต่ คุณต้องตรวจสอบว่า Interpreter::Invoke() ถูกเรียกจากชื่อ ชุดข้อความที่มีการเรียกใช้ Interpreter::ModifyGraphWithDelegate()

เมื่อใช้ LiteRT ในบริการ Google Play

หากคุณใช้ LiteRT ใน C API ของบริการ Google Play คุณจะต้องใช้ Java/Kotlin API เพื่อตรวจสอบว่าผู้รับมอบสิทธิ์ GPU พร้อมใช้งานหรือไม่ สำหรับอุปกรณ์ของคุณก่อนเริ่มต้นรันไทม์ LiteRT

เพิ่มทรัพยากร Dependency ของ Gradle ที่มอบสิทธิ์ GPU ลงในแอปพลิเคชันดังนี้

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

จากนั้นตรวจสอบความพร้อมใช้งานของ GPU และเริ่มต้น 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 ใช้เพื่อกำหนดค่า มอบหมายปลั๊กอิน ดังนั้นคุณจึงต้องเพิ่มลงในทรัพยากร Dependency ของโค้ดแบบเนทีฟ คุณสามารถใช้การกำหนดค่าโปรเจ็กต์ 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 ของ Android รองรับโมเดลที่เล็กลงโดยค่าเริ่มต้น คุณไม่ได้ ต้องทำการเปลี่ยนแปลงโค้ดเพื่อใช้โมเดลที่ควอนซ์กับการมอบสิทธิ์ 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