Google Play পরিষেবা C এবং C++ API-এ LiteRT

Google Play পরিষেবার রানটাইমে LiterRT আপনাকে আপনার অ্যাপে LiterRT লাইব্রেরিগুলিকে স্ট্যাটিকভাবে বান্ডেল না করেই মেশিন লার্নিং (ML) মডেলগুলি চালাতে দেয়। এই নির্দেশিকাটি Google Play পরিষেবার জন্য C বা C++ API কীভাবে ব্যবহার করবেন সে সম্পর্কে নির্দেশাবলী প্রদান করে।

গুগল প্লে সার্ভিসেস সি এপিআই বা সি++ এপিআই-তে লিটারআরটি দিয়ে কাজ করার আগে, নিশ্চিত করুন যে আপনার কাছে সিমেক বিল্ড টুল ইনস্টল করা আছে।

আপনার বিল্ড কনফিগারেশন আপডেট করুন

(১) LiterRT-এর জন্য Play services API অ্যাক্সেস করতে আপনার অ্যাপ প্রজেক্ট কোডে নিম্নলিখিত নির্ভরতা যোগ করুন:

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

মনে রাখবেন যে প্যাকেজের নাম -java দিয়ে শেষ হলেও, সেই প্যাকেজটিতে C এবং C++ APIও রয়েছে।

(২) তারপর, আপনার মডিউলের build.gradle ফাইলের android ব্লক আপডেট করে আপনার CMake স্ক্রিপ্ট থেকে C API অ্যাক্সেস করার জন্য Prefab বৈশিষ্ট্যটি সক্ষম করুন:

buildFeatures {
  prefab = true
}

(৩) [শুধুমাত্র C++ API] যদি আপনি C++ API ব্যবহার করেন, তাহলে tflite-java-extract-cpp-sdk.gradle আপনার প্রোজেক্টে, আপনার app ডিরেক্টরিতে কপি করুন এবং আপনার অ্যাপের gradle স্ক্রিপ্টের শুরুতে নিম্নলিখিতটি যোগ করুন (যেমন app/build.gradle ):

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

এতে play-services-tflite-java এর জন্য AAR ফাইল থেকে C++ SDK স্বয়ংক্রিয়ভাবে আনপ্যাক করার জন্য Gradle কোড রয়েছে।

(৪) [শুধুমাত্র C++ API] যদি আপনি C++ API ব্যবহার করেন, তাহলে আপনার অ্যাপের CMake কনফিগ ফাইল (সাধারণত CMakeLists.txt ) ধারণকারী ডিরেক্টরিটি খুঁজুন; সেই ডিরেক্টরিটি সাধারণত আপনার app/src/main/cpp ডিরেক্টরি। তারপর Findtflite_cc_api.cmake আপনার প্রোজেক্টে, সেই ডিরেক্টরির একটি নতুন Modules সাবডিরেক্টরিতে কপি করুন। এতে এমন কোড রয়েছে যা পূর্ববর্তী ধাপে Gradle স্ক্রিপ্ট দ্বারা আনপ্যাক করা C++ SDK খুঁজে পায়।

(৫) অবশেষে আপনাকে প্যাকেজটি যোগ করতে হবে 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 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)
      

LiterRT রানটাইম শুরু করুন

LiterRT C অথবা C++ API কল করার আগে আপনাকে অবশ্যই আপনার জাভা বা কোটলিন কোডে TfLiteNative রানটাইম ইনিশিয়ালাইজ করতে হবে।

জাভা

Task tfLiteInitializeTask = TfLiteNative.initialize(context);
      

কোটলিন

val tfLiteInitializeTask: Task = TfLiteNative.initialize(context)
        

Google Play services Task API ব্যবহার করে, TfLiteNative.initialize আপনার অ্যাপ্লিকেশনের রানটাইম প্রক্রিয়ায় Google Play services থেকে LiterRT রানটাইমকে অ্যাসিঙ্ক্রোনাসভাবে লোড করে। LiterRT API অ্যাক্সেস করে এমন কোড কার্যকর করার আগে TfLite.initialize() টাস্কটি সম্পূর্ণ হয়েছে কিনা তা নিশ্চিত করতে addOnSuccessListener() ব্যবহার করুন। কাজটি সফলভাবে সম্পন্ন হয়ে গেলে, আপনি সমস্ত উপলব্ধ LiteRT Native API ব্যবহার করতে পারেন।

নেটিভ কোড বাস্তবায়ন

আপনার C/C++ কোড দিয়ে Google Play পরিষেবাগুলিতে LiterRT ব্যবহার করতে, আপনি নিম্নলিখিতগুলির মধ্যে একটি (অথবা উভয়) করতে পারেন:

  • আপনার জাভা কোড থেকে C অথবা C++ ফাংশন কল করার জন্য নতুন JNI ফাংশন ঘোষণা করুন।
  • আপনার বিদ্যমান C অথবা C++ কোড থেকে LiterRT নেটিভ API কল করুন।

JNI ফাংশন

C/C++ কোডে ঘোষিত LiterRT রানটাইমকে আপনার জাভা/কোটলিন কোডে অ্যাক্সেসযোগ্য করে তুলতে আপনি নিম্নলিখিতভাবে নতুন JNI ফাংশন ঘোষণা করতে পারেন:

জাভা

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")
    // ...
}
      

নেটিভ কোডে LiterRT

Google Play পরিষেবা API-এর সাথে LiterRT অন্তর্ভুক্ত করার জন্য উপযুক্ত API হেডার ফাইলটি অন্তর্ভুক্ত করুন:

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

সি++

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

এরপর আপনি নিয়মিত LiterRT C অথবা C++ API ব্যবহার করতে পারেন:

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 গুলি

Google Play পরিষেবা C API হেডার সহ LiterRT নিয়মিত LiterRT C API এর মতো একই API প্রদান করে, অবচিত বা পরীক্ষামূলক বৈশিষ্ট্যগুলি বাদ দিয়ে। আপাতত নিম্নলিখিত হেডারগুলির ফাংশন এবং প্রকারগুলি উপলব্ধ।

টেনসরফ্লো লাইট এপিআই মডেল লোড এবং এক্সিকিউট করার জন্য:

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

টেনসরফ্লো লাইট এক্সটেনশন API গুলি কাস্টম অপস এবং ডেলিগেট সংজ্ঞায়িত করার জন্য (যেমন হার্ডওয়্যার অ্যাক্সিলারেশনের জন্য):

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 হেডারের ফাংশনগুলি সমর্থিত নয়।

আপনি নিম্নলিখিত শিরোনামটি অন্তর্ভুক্ত করে Google Play পরিষেবাগুলির সাথে LiterRT-এর জন্য নির্দিষ্ট ফাংশনগুলি ব্যবহার করতে পারেন:

tensorflow/lite/abi/tflite.h
.

সি++

Google Play পরিষেবা C++ API হেডার সহ LiterRT নিয়মিত LiterT C++ API এর মতো একই API প্রদান করে, যে বৈশিষ্ট্যগুলি অবচিত বা পরীক্ষামূলক, এবং এই বিভাগে পরে উল্লেখ করা কিছু ছোটখাটো ব্যতিক্রম ছাড়া। নিম্নলিখিত হেডারগুলির কার্যকারিতা উপলব্ধ:

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 এর জন্য, Play পরিষেবা সহ সমর্থিত API tflite::Interpreter এর কিছু সদস্যকে বাদ দেয় যার জন্য LiterRT একটি স্থিতিশীল 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)