ตัวแทนการเร่งความเร็ว GPU ด้วย C/C++ API

การใช้หน่วยประมวลผลกราฟิก (GPU) เพื่อรันโมเดล Machine Learning (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 build คุณสามารถสร้างผู้รับมอบสิทธิ์โดยใช้คำสั่งต่อไปนี้:

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'

จากนั้น ตรวจสอบความพร้อมใช้งานของ GPU และเริ่มต้น 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