Ủy quyền tăng tốc GPU với API C/C++

Việc sử dụng bộ xử lý đồ họa (GPU) để chạy mô hình máy học (ML) có thể 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ợ ML của bạn. Trên thiết bị Android, bạn có thể kích hoạt việc thực thi các mô hình của mình được tăng tốc bằng GPU bằng cách sử dụng đại biểu và một trong các API sau:

Hướng dẫn này bao gồm các cách sử dụng nâng cao của đại biểu GPU cho API C, API C++ và cách sử dụng các mô hình lượng tử hóa. Để 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 phương pháp hay nhất và kỹ thuật nâng cao, hãy xem trang đại biểu GPU .

Bật tăng tốc GPU

Sử dụng đại biểu GPU TensorFlow Lite cho Android trong C hoặc C++ bằng cách tạo đại biểu bằng TfLiteGpuDelegateV2Create() và hủy nó bằng TfLiteGpuDelegateV2Delete() , như 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 lại mã đối tượng TfLiteGpuDelegateOptionsV2 để xây dựng phiên bản đại biểu với các tùy chọn tùy chỉnh. Bạn có thể khởi tạo các tùy chọn mặc định bằng TfLiteGpuDelegateOptionsV2Default() rồi sửa đổi chúng nếu cần.

Đại biểu GPU TensorFlow Lite dành cho Android trong C hoặc C++ sử dụng hệ thống xây dựng Bazel . Bạn có thể xây dựng đại biểu bằ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() , người gọi phải có EGLContext trong chuỗi 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, đại biểu sẽ tạo một EGLContext nội bộ, nhưng sau đó bạn phải đảm bảo rằng Interpreter::Invoke() luôn được gọi từ cùng một luồng mà Interpreter::ModifyGraphWithDelegate() đã được gọi.

Với TensorFlow Lite trong Dịch vụ của 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 thiết bị của bạn có sẵn ủy quyền GPU 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 cấp độ đại biểu GPU vào ứng dụng của bạn:

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

Sau đó, kiểm tra tính khả dụng của GPU và khởi chạy TfLiteNative nếu kiểm tra thành công:

Java

Task 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 của mình để bao gồm cờ trình biên dịch TFLITE_USE_OPAQUE_DELEGATE :

add_compile_definitions(TFLITE_USE_OPAQUE_DELEGATE)

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

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

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

Cuối cùng, để sử dụng suy luận GPU trong mã C của bạn, hãy tạo đại biểu 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ử hóa

Theo mặc định, thư viện đại biểu GPU của Android hỗ trợ các mô hình lượng tử hóa. Bạn không cần phải thực hiện bất kỳ thay đổi mã nào để sử dụng các mô hình lượng tử hóa với đại biểu GPU. Phần sau đây giải thích cách tắt hỗ trợ lượng tử hóa cho mục đích thử nghiệm hoặc thử nghiệm.

Tắt hỗ trợ mô hình lượng tử hóa

Đoạn mã sau cho biết cách tắt hỗ trợ cho các mô hình lượng tử hóa.

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ử hóa với khả năng tăng tốc GPU, hãy xem tổng quan về đại biểu GPU .