LiteRT в API сервисов Google Play C и C++

LiteRT в среде выполнения сервисов Google Play позволяет запускать модели машинного обучения (ML) без статического объединения библиотек LiteRT в ваше приложение. В этом руководстве представлены инструкции по использованию API C или C++ для сервисов Google Play.

Прежде чем работать с LiteRT в API C или C++ сервисов Google Play, убедитесь, что у вас установлен инструмент сборки CMake .

Обновите конфигурацию сборки

(1) Добавьте следующие зависимости в код проекта вашего приложения, чтобы получить доступ к API сервисов Play для LiteRT:

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

Обратите внимание: хотя имя пакета заканчивается на -java , этот пакет также содержит API C и C++.

(2) Затем включите функцию Prefab для доступа к C API из вашего сценария CMake, обновив блок Android файла build.gradle вашего модуля:

buildFeatures {
  prefab = true
}

(3) [Только C++ API] Если вы используете C++ API, скопируйте tflite-java-extract-cpp-sdk.gradle в свой проект, в каталог вашего app , и добавьте следующее в начало сценария Gradle вашего приложения ( например app/build.gradle ):

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

Он содержит код Gradle для автоматической распаковки C++ SDK из файла AAR для play-services-tflite-java .

(4) [Только API C++] Если вы используете API C++, найдите каталог, содержащий файл конфигурации CMake вашего приложения (обычно CMakeLists.txt ); этот каталог обычно является вашим каталогом app/src/main/cpp . Затем скопируйте Findtflite_cc_api.cmake в свой проект в новый подкаталог Modules этого каталога. Он содержит код, который находит C++ SDK, распакованный сценарием Gradle на предыдущем шаге.

(5) Наконец, вам нужно добавить пакет tensorflowlite_jni_gms_client , а для C++ API — также пакет tflite_cc_api , оба из которых импортированы из AAR, в качестве зависимостей в вашем скрипте CMake:

С

``` find_package(tensorflowlite_jni_gms_client ТРЕБУЕМАЯ КОНФИГУРАЦИЯ) # Установите флаги компилятора C/C++, чтобы разрешить использование TFLite в сервисах Play # (вместо обычного TFLite, поставляемого в комплекте с приложением). add_compile_definitions(TFLITE_IN_GMSCORE) add_compile_definitions(TFLITE_WITH_STABLE_ABI) target_link_libraries(tflite-jni # ваша цель библиотеки JNI tensorflowlite_jni_gms_client::tensorflowlite_jni_gms_client android # другие настройки для вашего целевого журнала) ```

С++

``` # Настройте TFLite в зависимости C API сервисов Play (tensorflowlite_jni_gms_client). find_package(tensorflowlite_jni_gms_client ТРЕБУЕМАЯ КОНФИГ) # Настройте TFLite в зависимости API сервисов Play от C++ (tflite_cc_api). list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Modules") find_package(tflite_cc_api ТРЕБУЕМЫЙ МОДУЛЬ) include_directories(${tflite_cc_api_INCLUDE_DIR}) add_subdirectory(${tflite_cc_api_DIR} tflite_cc_api_build) # Set установите флаги компилятора C/C++, чтобы разрешить использование TFLite в сервисах Play # (вместо обычного TFLite, поставляемого в комплекте с приложением). add_compile_definitions(TFLITE_IN_GMSCORE) add_compile_definitions(TFLITE_WITH_STABLE_ABI) target_link_libraries(tflite-jni # ваша цель библиотеки JNI tflite_cc_api::tflite_cc_api tensorflowlite_jni_gms_client::tensorflowlite_jni_gms_client android # другие настройки для ваш целевой журнал) ```

Инициализируйте среду выполнения LiteRT

Перед вызовом API LiteRT Native вы должны инициализировать среду выполнения TfLiteNative в своем коде Java или Kotlin.

Ява

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

Котлин

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Используя API задач служб Google Play, TfLiteNative.initialize асинхронно загружает среду выполнения TFLite из служб Google Play в процесс выполнения вашего приложения. Используйте addOnSuccessListener() чтобы убедиться, что задача TfLite.initialize() завершена, прежде чем выполнять код, который обращается к API-интерфейсам LiteRT. После успешного завершения задачи вы можете вызвать все доступные собственные API TFLite.

Реализация собственного кода

Чтобы использовать LiteRT в сервисах Google Play с кодом C/C++, вы можете выполнить одно (или оба) из следующих действий:

  • объявите новые функции JNI для вызова функций C или C++ из вашего кода Java.
  • вызовите LiteRT Native API из существующего кода C или C++.

JNI-функции

Вы можете объявить новые функции JNI, чтобы сделать среду выполнения LiteRT, объявленную в коде C/C++, доступной для вашего кода Java/Kotlin, следующим образом:

Ява

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

Котлин

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

Соответствие следующим функциям loadModel и runInference C или C++:

#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

Затем вы можете вызывать функции C/C++ из кода Java/Kotlin:

Ява

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

Котлин

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

LiteRT в собственном коде

Включите соответствующий файл заголовка API, чтобы включить LiteRT в API сервисов Google Play:

С

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

С++

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

Затем вы можете использовать обычный API LiteRT C или C++:

С

```c++ TfLiteModel* model = TfLiteModelCreate(model_asset, model_asset_length); // ... TfLiteInterpreterOptions* options = TfLiteInterpreterOptionsCreate(); // ... TfLiteInterpreter* интерпретатор = TfLiteInterpreterCreate(model, options); ```

С++

```c++ // Загрузите модель. автоматическая модель = tflite::FlatBufferModel::VerifyAndBuildFromBuffer( model_asset, model_asset_length); ... // Инициализируем интерпретатор. ВстроенныйOpResolver op_resolver; InterpreterBuilderinterpreter_builder(*модель, op_resolver); interpreter_builder(&интерпретатор); std::unique_ptr<Interpreter>` интерпретатор; interpreter_builder(&интерпретатор); ```

Поддерживаемые API

С

Заголовки собственного API LiteRT с сервисами Google Play предоставляют тот же API, что и обычный [LiteRT C API](../../api/tflite/c), за исключением устаревших или экспериментальных функций. На данный момент доступны функции и типы из следующих заголовков. API-интерфейсы TensorFlow Lite для загрузки и выполнения моделей: ```none tensorflow/lite/c/c_api.h tensorflow/lite/c/c_api_types.h ``` API расширения TensorFlow Lite для определения пользовательских операций и делегатов (например, для аппаратного ускорения): ```none tensorflow/lite/c/c_api_opaque.h tensorflow/lite/c/common.h tensorflow/lite/c/builtin_op_data.h tensorflow/lite/builtin_ops. h ``` API подключаемых модулей делегатов для использования существующих делегатов: ```нет tensorflow/lite/acceleration/configuration/c/gpu_plugin.h tensorflow/lite/acceleration/configuration/c/xnnpack_plugin.h ``` Обратите внимание, что функции из заголовка `c_api_experimental.h` не поддерживаются. Вы можете использовать функции, специфичные для LiteRT, с сервисами Google Play, включив tensorflow/lite/abi/tflite.h.

С++

Заголовки собственного API LiteRT с сервисами Google Play предоставляют тот же API, что и обычный [LiteRT C++ API](../../api/tflite/cc), за исключением функций, которые являются устаревшими или экспериментальными, и за некоторыми незначительными исключениями. далее в этом разделе. Доступна функциональность следующих заголовков: ```none 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 ``` Для `tensorflow/lite/interpreter.h` поддерживаемый API со службами Play исключает несколько членов `tflite::Interpreter` для который LiteRT не предлагает стабильный ABI: ```c++ Interpreter::variables() Interpreter::nodes_size() Interpreter::node_and_registration(int node_index) Интерпретатор::kTensorsReservedCapacity Интерпретатор::kTensorsCapacityHeadroom Интерпретатор::OpProfilingString(const TfLiteRegistration&, const TfLiteNode*) Интерпретатор::SetExternalContext(TfLiteExternalContextType type, TfLiteExternalContext* ctx) ```