LiteRT در زمان اجرای سرویسهای Google Play به شما امکان میدهد مدلهای یادگیری ماشین (ML) را بدون نیاز به باندل کردن کتابخانههای LiteRT به صورت ایستا در برنامه خود اجرا کنید. این راهنما دستورالعملهایی در مورد نحوه استفاده از APIهای C یا C++ برای سرویسهای 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) سپس، با بهروزرسانی بلوک android از فایل build.gradle ماژول خود، ویژگی Prefab را برای دسترسی به API C از اسکریپت CMake خود فعال کنید:
buildFeatures {
prefab = true
}
(3) [فقط API سیپلاسپلاس] اگر از 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 سیپلاسپلاس] اگر از API سیپلاسپلاس استفاده میکنید، پوشهای را که حاوی فایل پیکربندی CMake برنامه شماست (معمولاً CMakeLists.txt ) پیدا کنید؛ آن پوشه معمولاً پوشه app/src/main/cpp شماست. سپس Findtflite_cc_api.cmake را در پروژه خود، در یک زیرشاخه جدید Modules از آن پوشه، کپی کنید. این شامل کدی است که SDK سیپلاسپلاس را که توسط اسکریپت Gradle در مرحله قبل از حالت فشرده خارج شده است، پیدا میکند.
(5) در نهایت باید بسته tensorflowlite_jni_gms_client و برای API مربوط به C++ نیز بسته tflite_cc_api را که هر دو از AAR ایمپورت شدهاند، به عنوان وابستگی در اسکریپت CMake خود اضافه کنید:
سی
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)
سی++
# 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)
مقداردهی اولیه زمان اجرای LiteRT
قبل از فراخوانی API مربوط به LiteRT C یا C++، باید زمان اجرای TfLiteNative را در کد جاوا یا کاتلین خود مقداردهی اولیه کنید.
جاوا
Task tfLiteInitializeTask = TfLiteNative.initialize(context);
کاتلین
val tfLiteInitializeTask: Task= TfLiteNative.initialize(context)
با استفاده از API Task سرویسهای Google Play، TfLiteNative.initialize به صورت غیرهمزمان، زمان اجرای LiteRT را از سرویسهای Google Play در فرآیند زمان اجرای برنامه شما بارگذاری میکند. addOnSuccessListener() برای اطمینان از تکمیل وظیفه TfLite.initialize() قبل از اجرای کدی که به APIهای LiteRT دسترسی دارد، استفاده کنید. پس از اتمام موفقیتآمیز وظیفه، میتوانید تمام APIهای LiteRT Native موجود را فراخوانی کنید.
پیادهسازی کد بومی
برای استفاده از LiteRT در سرویسهای گوگل پلی با کد C/C++ خود، میتوانید یکی (یا هر دو) از موارد زیر را انجام دهید:
- توابع JNI جدید را برای فراخوانی توابع C یا C++ از کد جاوای خود تعریف کنید.
- API بومی LiteRT را از کد 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++ خود را از کد جاوا/کاتلین خود فراخوانی کنید:
جاوا
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 زبان C مربوط به LiteRT با سرویسهای Google Play، همان API مربوط به LiteRT C API معمولی را ارائه میدهند، به جز ویژگیهایی که منسوخ یا آزمایشی هستند. در حال حاضر، توابع و انواع هدرهای زیر در دسترس هستند.
رابطهای برنامهنویسی کاربردی تنسورفلو لایت
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های افزونه Delegate برای استفاده از delegateهای موجود:
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
سی++
هدرهای 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)