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

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

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

การใช้ TensorFlow Lite ในบริการ Google Play

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

เพิ่มทรัพยากร 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