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 REQUIRED CONFIG) # Set up C/C++ compiler flags to enable use of TFLite in Play services # (rather than regular TFLite 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)
С++
# Set up TFLite in Play services C API (tensorflowlite_jni_gms_client) dependency. find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG) # Set up TFLite 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 TFLite in Play services # (rather than regular TFLite 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)
Инициализируйте среду выполнения 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 Native.
Реализация собственного кода
Чтобы использовать 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++:
С
TfLiteModel* model = TfLiteModelCreate(model_asset, model_asset_length); // ... TfLiteInterpreterOptions* options = TfLiteInterpreterOptionsCreate(); // ... TfLiteInterpreter* interpreter = TfLiteInterpreterCreate(model, options);
С++
// 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);
Поддерживаемые API
С
Заголовки собственного API LiteRT с сервисами Google Play предоставляют тот же API, что и обычный [LiteRT C API](../../api/tflite/c), за исключением функций, которые являются устаревшими или экспериментальными. На данный момент доступны функции и типы из следующих заголовков. API-интерфейсы TensorFlow Litetensorflow/lite/c/c_api.h tensorflow/lite/c/c_api_types.h
tensorflow/lite/c/c_api_opaque.h tensorflow/lite/c/common.h tensorflow/lite/c/builtin_op_data.h tensorflow/lite/builtin_ops.h
tensorflow/lite/acceleration/configuration/c/gpu_plugin.h tensorflow/lite/acceleration/configuration/c/xnnpack_plugin.h
С++
Заголовки собственного API LiteRT с сервисами Google Play предоставляют тот же API, что и обычный [LiteRT C++ API](../../api/tflite/cc), за исключением функций, которые являются устаревшими или экспериментальными, и за некоторыми отмеченными незначительными исключениями. далее в этом разделе. Доступен функционал из следующих заголовков: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
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)