LiteRT trong API C và C++ của Dịch vụ Google Play

LiteRT trong thời gian chạy Dịch vụ Google Play cho phép bạn chạy các mô hình học máy (ML) mà không cần liên kết tĩnh các thư viện LiteRT vào ứng dụng của mình. Hướng dẫn này cung cấp hướng dẫn về cách sử dụng các API C hoặc C++ cho Dịch vụ Google Play.

Trước khi làm việc với LiteRT trong API C hoặc API C++ của Dịch vụ Google Play, hãy đảm bảo bạn đã cài đặt công cụ tạo CMake.

Cập nhật cấu hình bản dựng

(1) Thêm các phần phụ thuộc sau vào mã dự án ứng dụng để truy cập vào API Dịch vụ Play cho LiteRT:

implementation "com.google.android.gms:play-services-tflite-java:16.4.0"

Xin lưu ý rằng mặc dù tên gói kết thúc bằng -java, nhưng gói đó cũng chứa các API C và C++.

(2) Sau đó, hãy bật tính năng Prefab để truy cập vào C API từ tập lệnh CMake bằng cách cập nhật khối android của tệp build.gradle trong mô-đun:

buildFeatures {
  prefab = true
}

(3) [Chỉ API C++] Nếu bạn đang sử dụng API C++, hãy sao chép tflite-java-extract-cpp-sdk.gradle vào dự án của bạn, trong thư mục app và thêm nội dung sau vào đầu tập lệnh gradle của ứng dụng (ví dụ: app/build.gradle):

apply from: 'tflite-java-extract-cpp-sdk.gradle'

Thư mục này chứa mã Gradle để tự động giải nén C++ SDK từ tệp AAR cho play-services-tflite-java.

(4) [Chỉ API C++] Nếu bạn đang sử dụng API C++, hãy tìm thư mục chứa tệp cấu hình CMake của ứng dụng (thường là CMakeLists.txt); thư mục đó thường là thư mục app/src/main/cpp của bạn. Sau đó, hãy sao chép Findtflite_cc_api.cmake vào dự án của bạn, trong một thư mục con Modules mới của thư mục đó. Thư mục này chứa mã tìm SDK C++ do tập lệnh Gradle giải nén ở bước trước.

(5) Cuối cùng, bạn cần thêm gói tensorflowlite_jni_gms_client và đối với C++ API, bạn cũng cần thêm gói tflite_cc_api. Cả hai gói này đều được nhập từ AAR dưới dạng các phần phụ thuộc trong tập lệnh CMake:

C

find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG)

# Set up C/C++ compiler flags to enable use of LiteRT in Play services
# (rather than regular LiteRT bundled with the app).
add_compile_definitions(TFLITE_IN_GMSCORE)
add_compile_definitions(TFLITE_WITH_STABLE_ABI)

target_link_libraries(tflite-jni # your JNI lib target
        tensorflowlite_jni_gms_client::tensorflowlite_jni_gms_client
        android # other deps for your target
        log)
      

C++

# Set up LiteRT in Play services C API (tensorflowlite_jni_gms_client) dependency.

find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG)

# Set up LiteRT in Play services C++ API (tflite_cc_api) dependency.

list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Modules")

find_package(tflite_cc_api REQUIRED MODULE)
include_directories(${tflite_cc_api_INCLUDE_DIR})
add_subdirectory(${tflite_cc_api_DIR} tflite_cc_api_build)

# Set up C/C++ compiler flags to enable use of LiteRT in Play services
# (rather than regular LiteRT bundled with the app).
add_compile_definitions(TFLITE_IN_GMSCORE)
add_compile_definitions(TFLITE_WITH_STABLE_ABI)

target_link_libraries(tflite-jni # your JNI lib target
        tflite_cc_api::tflite_cc_api
        tensorflowlite_jni_gms_client::tensorflowlite_jni_gms_client
        android # other deps for your target
        log)
      

Khởi chạy thời gian chạy LiteRT

Trước khi gọi API C hoặc C++ LiteRT, bạn phải khởi động thời gian chạy TfLiteNative trong mã Java hoặc Kotlin.

Java

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Kotlin

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Bằng cách sử dụng Task API của Dịch vụ Google Play, TfLiteNative.initializetải không đồng bộ thời gian chạy LiteRT từ Dịch vụ Google Play vào quy trình thời gian chạy của ứng dụng. Sử dụng addOnSuccessListener() để đảm bảo tác vụ TfLite.initialize() hoàn tất trước khi thực thi mã truy cập vào API LiteRT. Sau khi hoàn tất thành công, bạn có thể gọi tất cả các API gốc LiteRT hiện có.

Triển khai mã gốc

Để sử dụng LiteRT trong Dịch vụ Google Play với mã C/C++, bạn có thể thực hiện một (hoặc cả hai) thao tác sau:

  • khai báo các hàm JNI mới để gọi các hàm C hoặc C++ qua mã Java
  • gọi LiteRT Native API từ mã C hoặc C++ hiện có.

Hàm JNI

Bạn có thể khai báo các hàm JNI mới để giúp mã Java/Kotlin truy cập vào thời gian chạy LiteRT được khai báo trong mã C/C++ như sau:

Java

package com.google.samples.gms.tflite.c;

public class TfLiteJni {
  static {
    System.loadLibrary("tflite-jni");
  }
  public TfLiteJni() { /**/ };
  public native void loadModel(AssetManager assetManager, String assetName);
  public native float[] runInference(float[] input);  // For example.
}
      

Kotlin

package com.google.samples.gms.tflite.c

class TfLiteJni() {
  companion object {
    init {
      System.loadLibrary("tflite-jni")
    }
  }
  external fun loadModel(assetManager: AssetManager, assetName: String)
  external fun runInference(input: FloatArray): FloatArray  // For example.
}
        

So khớp các hàm loadModelrunInference C hoặc C++ sau đây:

#ifdef __cplusplus
extern "C" {
#endif

void Java_com_google_samples_gms_tflite_c_loadModel(
  JNIEnv *env, jobject tflite_jni, jobject asset_manager, jstring asset_name){
  //...
}

jfloatArray Java_com_google_samples_gms_tflite_c_TfLiteJni_runInference(
  JNIEnv* env, jobject tfliteJni, jfloatArray input) {
  //...
}

#ifdef __cplusplus
}  // extern "C".
#endif

Sau đó, bạn có thể gọi các hàm C/C++ từ mã Java/Kotlin:

Java

tfLiteHandleTask.onSuccessTask(unused -> {
    TfLiteJni jni = new TfLiteJni();
    jni.loadModel(getAssets(), "add.bin");
    //...
});
    

Kotlin

tfLiteHandleTask.onSuccessTask {
    val jni = TfLiteJni()
    jni.loadModel(assets, "add.bin")
    // ...
}
      

LiteRT trong mã gốc

Thêm tệp tiêu đề API thích hợp để thêm LiteRT bằng API Dịch vụ Google Play:

C

#include "tensorflow/lite/c/c_api.h"
      

C++

#include "tensorflow/lite/interpreter.h"
#include "tensorflow/lite/model_builder.h"
      

Sau đó, bạn có thể sử dụng API C hoặc C++ LiteRT thông thường:

C

TfLiteModel* model = TfLiteModelCreate(model_asset, model_asset_length);
// ...
TfLiteInterpreterOptions* options = TfLiteInterpreterOptionsCreate();
// ...
TfLiteInterpreter* interpreter = TfLiteInterpreterCreate(model, options);
      

C++

  // Load the model.
  auto model = tflite::FlatBufferModel::VerifyAndBuildFromBuffer(
      model_asset, model_asset_length);
  ...
  // Initialize the interpreter.
  BuiltinOpResolver op_resolver;
  InterpreterBuilder interpreter_builder(*model, op_resolver);
  interpreter_builder(&interpreter);
  std::unique_ptr<Interpreter>` interpreter;
  interpreter_builder(&interpreter);
      

Các API được hỗ trợ

C

Tiêu đề C API của LiteRT có các dịch vụ Google Play cung cấp cùng một API như LiteRT C API thông thường, ngoại trừ những tính năng không dùng nữa hoặc thử nghiệm. Hiện tại, các hàm và loại từ các tiêu đề sau đây có sẵn.

API TensorFlow Lite để tải và thực thi các mô hình:

tensorflow/lite/c/c_api.h
tensorflow/lite/c/c_api_types.h
      

API Tiện ích TensorFlow Lite để xác định các thao tác và đại biểu tuỳ chỉnh (ví dụ: để tăng tốc phần cứng):

tensorflow/lite/c/c_api_opaque.h
tensorflow/lite/c/common.h
tensorflow/lite/c/builtin_op_data.h
tensorflow/lite/builtin_ops.h
      

Uỷ quyền các API bổ trợ để sử dụng các đại biểu hiện có:

tensorflow/lite/acceleration/configuration/c/gpu_plugin.h
tensorflow/lite/acceleration/configuration/c/xnnpack_plugin.h
      

Xin lưu ý rằng các hàm trong tiêu đề c_api_experimental.h không được hỗ trợ.

Bạn có thể sử dụng các hàm dành riêng cho LiteRT bằng Dịch vụ Google Play bằng cách thêm tiêu đề sau:

tensorflow/lite/abi/tflite.h
.

C++

Tiêu đề LiteRT có API C++ của Dịch vụ Google Play cung cấp cùng một API như API C++ LiteRT thông thường, ngoại trừ những tính năng không dùng nữa hoặc thử nghiệm, và một số trường hợp ngoại lệ nhỏ được lưu ý sau trong phần này. Bạn có thể sử dụng chức năng của các tiêu đề sau:

tensorflow/lite/model_builder.h
tensorflow/lite/interpreter_builder.h
tensorflow/lite/interpreter.h
tensorflow/lite/signature_runner.h
tensorflow/lite/acceleration/configuration/delegate_registry.h
tensorflow/lite/kernels/builtin_op_kernels.h
tensorflow/lite/kernels/register.h
tensorflow/lite/tools/verifier.h
      

Đối với tensorflow/lite/interpreter.h, API được hỗ trợ có các dịch vụ Play sẽ loại trừ một số thành phần của tflite::Interpreter mà LiteRT không cung cấp ABI ổn định:

Interpreter::variables()
Interpreter::nodes_size()
Interpreter::node_and_registration(int node_index)
Interpreter::kTensorsReservedCapacity
Interpreter::kTensorsCapacityHeadroom
Interpreter::OpProfilingString(const TfLiteRegistration&, const TfLiteNode*)
Interpreter::SetExternalContext(TfLiteExternalContextType type, TfLiteExternalContext* ctx)