การใช้หน่วยประมวลผลกราฟิก (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