LiteRT در سرویس‌های Google Play C و C++ API

LiteRT در سرویس‌های Google Play به شما امکان می‌دهد مدل‌های یادگیری ماشینی (ML) را بدون جمع‌بندی استاتیک کتابخانه‌های LiteRT در برنامه خود اجرا کنید. این راهنما دستورالعمل‌هایی در مورد نحوه استفاده از C یا C++ API برای سرویس‌های Google Play ارائه می‌دهد.

قبل از کار با LiteRT در سرویس‌های Google Play C API یا C++ API، مطمئن شوید که ابزار ساخت 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 خود با به روز رسانی بلوک اندرویدی فایل 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) [فقط C++ API] اگر از C++ API استفاده می‌کنید، دایرکتوری حاوی فایل پیکربندی 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)
      

C++

# 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 را راه اندازی کنید

قبل از فراخوانی LiteRT C یا C++ API، باید زمان اجرا TfLiteNative را در کد جاوا یا کاتلین خود مقداردهی کنید.

جاوا

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

کاتلین

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

با استفاده از Google Play Services Task API، TfLiteNative.initialize به طور ناهمزمان زمان اجرا TFLite را از سرویس های Google Play در فرآیند زمان اجرا برنامه شما بارگیری می کند. از addOnSuccessListener() استفاده کنید تا مطمئن شوید که وظیفه TfLite.initialize() قبل از اجرای کدی که به API های LiteRT دسترسی دارد کامل شده است. هنگامی که کار با موفقیت انجام شد، می توانید تمام API های موجود TFLite Native را فراخوانی کنید.

پیاده سازی کد بومی

برای استفاده از LiteRT در سرویس‌های Google Play با کد C/C++ خود، می‌توانید یکی (یا هر دو) از موارد زیر را انجام دهید:

  • توابع جدید JNI را برای فراخوانی توابع C یا C++ از کد جاوا خود اعلام کنید
  • LiteRT Native API را از کد C یا C++ موجود خود تماس بگیرید.

توابع JNI

می‌توانید توابع جدید JNI را اعلام کنید تا زمان اجرای LiteRT اعلام‌شده در کد C/C++ برای کد جاوا/کوتلین به صورت زیر قابل دسترسی باشد:

جاوا

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++ خود را از کد جاوا/کوتلین خود فراخوانی کنید:

جاوا

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"
      

C++

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

سپس می توانید از LiteRT C یا C++ API معمولی استفاده کنید:

سی

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

API های پشتیبانی شده

سی

سرصفحه‌های C API خدمات LiteRT با Google Play همان API را با LiteRT C API معمولی ارائه می‌کنند، به استثنای ویژگی‌هایی که منسوخ شده یا آزمایشی هستند. در حال حاضر توابع و انواع هدرهای زیر در دسترس هستند.

API های TensorFlow Lite برای بارگذاری و اجرای مدل ها:

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

APIهای برنامه افزودنی TensorFlow Lite برای تعریف عملیات سفارشی و نمایندگان (مثلاً برای شتاب سخت افزار):

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
.

C++

سرصفحه‌های LiteRT با سرویس‌های Google Play C++ API مشابه API معمولی LiteRT C++ را ارائه می‌کنند، به استثنای ویژگی‌هایی که منسوخ شده یا آزمایشی هستند، و با چند استثناء جزئی که بعداً در این بخش ذکر شد. عملکرد از هدرهای زیر در دسترس است:

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 پایدار ارائه نمی‌کند، حذف می‌کند:

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)