การใช้หน่วยประมวลผลกราฟิก (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 หากการตรวจสอบสำเร็จ:
ชวา
TasktfLiteHandleTask = 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