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)