การใช้หน่วยประมวลผลกราฟิก (GPU) เพื่อเรียกใช้โมเดลแมชชีนเลิร์นนิง (ML) จะช่วยปรับปรุงประสิทธิภาพและประสบการณ์ของผู้ใช้ในแอปพลิเคชันที่เปิดใช้ ML ได้อย่างมาก ในอุปกรณ์ Android คุณเปิดใช้การรันโมเดลโดยใช้ GPU เป็นตัวเร่งได้โดยใช้การมอบสิทธิ์และ API รายการใดรายการหนึ่งต่อไปนี้
- Debuger API - คู่มือ
- Native (C/C++) 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