Ủy quyền tăng tốc GPU bằng API C/C++

Việc sử dụng đơn vị xử lý đồ hoạ (GPU) để chạy các mô hình học máy (ML) có thể giúp cải thiện đáng kể hiệu suất và trải nghiệm người dùng của các ứng dụng hỗ trợ công nghệ học máy. Trên thiết bị Android, bạn có thể bật tính năng thực thi được tăng tốc GPU cho các mô hình của mình bằng cách sử dụng tính năng uỷ quyền và một trong các API sau:

  • API Phiên dịch – hướng dẫn
  • API gốc (C/C++) – hướng dẫn này

Hướng dẫn này đề cập đến các cách sử dụng nâng cao của đại biểu GPU cho API C, API C++ và việc sử dụng các mô hình lượng tử hoá. Để biết thêm thông tin về cách sử dụng đại biểu GPU cho TensorFlow Lite, bao gồm cả các phương pháp hay nhất và kỹ thuật nâng cao, hãy xem trang uỷ quyền GPU.

Bật tính năng tăng tốc GPU

Sử dụng uỷ quyền GPU TensorFlow Lite cho Android trong C hoặc C++ bằng cách tạo uỷ quyền bằng TfLiteGpuDelegateV2Create() và huỷ uỷ quyền bằng TfLiteGpuDelegateV2Delete(), như minh hoạ trong mã ví dụ sau:

// 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);

Xem xét mã đối tượng TfLiteGpuDelegateOptionsV2 để tạo một thực thể uỷ quyền bằng các tuỳ chọn tuỳ chỉnh. Bạn có thể khởi chạy các tuỳ chọn mặc định bằng TfLiteGpuDelegateOptionsV2Default() rồi sửa đổi các tuỳ chọn đó nếu cần.

Đại biểu GPU TensorFlow Lite cho Android trong C hoặc C++ sử dụng hệ thống xây dựng Bazel. Bạn có thể tạo thực thể đại diện bằng cách sử dụng lệnh sau:

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

Khi gọi Interpreter::ModifyGraphWithDelegate() hoặc Interpreter::Invoke(), phương thức gọi phải có EGLContext trong luồng hiện tại và Interpreter::Invoke() phải được gọi từ cùng một EGLContext. Nếu EGLContext không tồn tại, lớp uỷ quyền sẽ tạo một lớp uỷ quyền trong nội bộ, nhưng bạn phải đảm bảo rằng Interpreter::Invoke() luôn được gọi từ cùng một chuỗi mà Interpreter::ModifyGraphWithDelegate() được gọi.

Khi dùng TensorFlow Lite trong Dịch vụ Google Play:

Nếu đang sử dụng TensorFlow Lite trong API C của Dịch vụ Google Play, bạn sẽ cần sử dụng API Java/Kotlin để kiểm tra xem có đại biểu GPU cho thiết bị của mình hay không trước khi khởi chạy thời gian chạy TensorFlow Lite.

Thêm các phần phụ thuộc gradle ủy quyền GPU vào ứng dụng của bạn:

implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'

Sau đó, hãy kiểm tra tình trạng sẵn có của GPU và khởi chạy TfLiteNative nếu kiểm tra thành công:

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)
    }
        

Bạn cũng cần cập nhật cấu hình CMake để thêm cờ trình biên dịch TFLITE_USE_OPAQUE_DELEGATE:

add_compile_definitions(TFLITE_USE_OPAQUE_DELEGATE)

Thư viện FlatBuffers dùng để định cấu hình các trình bổ trợ uỷ quyền, vì vậy, bạn cần thêm thư viện này vào các phần phụ thuộc của mã gốc. Bạn có thể sử dụng cấu hình chính thức của dự án CMake như sau:

target_include_directories(tflite-jni PUBLIC
        third_party/headers # flatbuffers
     ...)

Bạn cũng có thể chỉ cần gói các tiêu đề cho ứng dụng của mình.

Cuối cùng, để sử dụng suy luận về GPU trong mã C của bạn, hãy tạo thực thể GPU bằng cách sử dụng 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);

Mô hình lượng tử hoá

Theo mặc định, các thư viện uỷ quyền GPU của Android hỗ trợ các mô hình lượng tử hoá. Bạn không cần phải thay đổi mã để sử dụng các mô hình lượng tử hoá với thực thể đại diện GPU. Phần sau đây giải thích cách tắt tính năng hỗ trợ lượng tử cho mục đích kiểm thử hoặc thử nghiệm.

Tắt tính năng hỗ trợ mô hình lượng tử hoá

Mã sau đây cho biết cách tắt tính năng hỗ trợ cho các mô hình lượng tử hoá.

C++

TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default();
options.experimental_flags = TFLITE_GPU_EXPERIMENTAL_FLAGS_NONE;

auto* delegate = TfLiteGpuDelegateV2Create(options);
if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
      

Để biết thêm thông tin về cách chạy các mô hình lượng tử hoá bằng tính năng tăng tốc GPU, hãy xem nội dung tổng quan về uỷ quyền GPU.