LiterRT এর সাথে GPU ত্বরণ

সিপিইউ-এর তুলনায় বিপুল সমান্তরাল থ্রুপুটের কারণে ডিপ লার্নিং অ্যাক্সিলারেশনের জন্য গ্রাফিক্স প্রসেসিং ইউনিট (GPU) সাধারণত ব্যবহৃত হয়। LiteRT, কম্পাইলড মডেল ( CompiledModel ) তৈরির সময় ব্যবহারকারীদের হার্ডওয়্যার অ্যাক্সিলারেশনকে একটি প্যারামিটার হিসেবে নির্দিষ্ট করার সুযোগ দিয়ে GPU অ্যাক্সিলারেশন ব্যবহারের প্রক্রিয়াকে সহজ করে তোলে।

LiteRT-এর GPU অ্যাক্সিলারেশনের সাহায্যে, আপনি GPU-বান্ধব ইনপুট ও আউটপুট বাফার তৈরি করতে পারেন, GPU মেমরিতে আপনার ডেটার জিরো-কপি অর্জন করতে পারেন, এবং প্যারালেলিজম সর্বোচ্চ করতে অ্যাসিঙ্ক্রোনাসভাবে টাস্ক সম্পাদন করতে পারেন।

শুরু করুন

GPU নির্ভরতা যোগ করুন

Use the following steps to add GPU dependency to your Kotlin or C++ application.

কোটলিন

For Kotlin users, the GPU accelerator is built-in and does not require additional steps beyond the Get Started guide.

সি++

C++ ব্যবহারকারীদের অবশ্যই LiteRT GPU অ্যাক্সিলারেশন সহ অ্যাপ্লিকেশনটির ডিপেন্ডেন্সিগুলো বিল্ড করতে হবে। cc_binary রুলটি, যা অ্যাপ্লিকেশনের মূল লজিক (যেমন, main.cc ) প্যাকেজ করে, তার জন্য নিম্নলিখিত রানটাইম কম্পোনেন্টগুলোর প্রয়োজন হয়:

  • LiteRT C API শেয়ার্ড লাইব্রেরি : data অ্যাট্রিবিউটে অবশ্যই LiteRT C API শেয়ার্ড লাইব্রেরি ( //litert/c:litert_runtime_c_api_shared_lib ) এবং GPU-নির্দিষ্ট উপাদানসমূহ ( litert_gpu_accelerator_prebuilts ) অন্তর্ভুক্ত থাকতে হবে।
  • অ্যাট্রিবিউট নির্ভরতা : deps অ্যাট্রিবিউটে সাধারণত GLES নির্ভরতা gles_deps() অন্তর্ভুক্ত থাকে, এবং linkopts সাধারণত gles_linkopts() অন্তর্ভুক্ত থাকে। GPU অ্যাক্সিলারেশনের জন্য উভয়ই অত্যন্ত প্রাসঙ্গিক, কারণ LiteRT প্রায়শই অ্যান্ড্রয়েডে OpenGLES ব্যবহার করে।
  • Model files and other assets : Included through the data attribute.

নিম্নলিখিতটি একটি cc_binary নিয়মের উদাহরণ:

load("//litert/build_common:special_rule.bzl", "litert_gpu_accelerator_prebuilts")

cc_binary(
    name = "your_application",
    srcs = [
        "main.cc",
    ],
    data = [
        ...
        # litert c api shared library
        "//litert/c:litert_runtime_c_api_shared_lib",
    ] + litert_gpu_accelerator_prebuilts(),
    linkopts = select({
        "@org_tensorflow//tensorflow:android": ["-landroid"],
        "//conditions:default": [],
    }) + gles_linkopts(), # gles link options
    deps = [
        ...
        "//litert/cc:litert_tensor_buffer", # litert cc library
        ...
    ] + gles_deps(), # gles dependencies
)

এই সেটআপটি আপনার কম্পাইল করা বাইনারিকে ত্বরান্বিত মেশিন লার্নিং ইনফারেন্সের জন্য ডাইনামিকভাবে জিপিইউ লোড ও ব্যবহার করার সুযোগ দেয়।

প্রি-বিল্ট জিপিইউ অ্যাক্সিলারেটর

নতুন LiteRT GPU Accelerator এখনও ওপেন সোর্স করা হয়নি। তবে প্রি-বিল্ট সংস্করণ পাওয়া যাচ্ছে। Kotlin ব্যবহারকারীদের জন্য, LiteRT Maven প্যাকেজেই GPU Accelerator অন্তর্ভুক্ত রয়েছে। C++ SDK ব্যবহারকারীদের এটি আলাদাভাবে ডাউনলোড করতে হবে।

Bazel-এ, আপনার টার্গেটে ডিপেন্ডেন্সি যোগ করতে আপনি নিম্নলিখিত রুলটি ব্যবহার করতে পারেন। cpp load("//litert/build_common:special_rule.bzl", "litert_gpu_accelerator_prebuilts")

CompiledModel API-এর সাথে GPU ব্যবহার করুন

GPU অ্যাক্সিলারেটর ব্যবহার শুরু করতে, কম্পাইল্ড মডেল ( CompiledModel ) তৈরি করার সময় GPU প্যারামিটারটি পাস করুন। নিম্নলিখিত কোড স্নিপেটটি সম্পূর্ণ প্রক্রিয়াটির একটি প্রাথমিক বাস্তবায়ন দেখায়:

সি++

// 1. Create a compiled model targeting GPU
LITERT_ASSIGN_OR_RETURN(auto env, Environment::Create({}));
LITERT_ASSIGN_OR_RETURN(auto compiled_model, CompiledModel::Create(env, "mymodel.tflite", kLiteRtHwAcceleratorGpu));

// 2. Prepare input/output buffers
LITERT_ASSIGN_OR_RETURN(auto input_buffers, compiled_model.CreateInputBuffers());
LITERT_ASSIGN_OR_RETURN(auto output_buffers, compiled_model.CreateOutputBuffers());

// 3. Fill input data (if you have CPU-based data)
input_buffers[0].Write<float>(absl::MakeConstSpan(cpu_data, data_size));

// 4. Execute
compiled_model.Run(input_buffers, output_buffers);

// 5. Access model output
std::vector<float> data(output_data_size);
output_buffers.Read<float>(absl::MakeSpan(data));

কোটলিন

// Load model and initialize runtime
val  model =
    CompiledModel.create(
        context.assets,
        "mymodel.tflite",
        CompiledModel.Options(Accelerator.GPU),
        env,
    )

// Preallocate input/output buffers
val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()

// Fill the first input
inputBuffers[0].writeFloat(FloatArray(data_size) { data_value /* your data */ })

// Invoke
model.run(inputBuffers, outputBuffers)

// Read the output
val outputFloatArray = outputBuffers[0].readFloat()

আরও তথ্যের জন্য, Get Started with C++ অথবা Get Started with Kotlin গাইডগুলো দেখুন।

জিপিইউ ত্বরণ সহ জিরো-কপি

জিরো-কপি ব্যবহারের মাধ্যমে জিপিইউ তার নিজের মেমরি থেকে সরাসরি ডেটা অ্যাক্সেস করতে পারে, যার জন্য সিপিইউ-কে সেই ডেটা আলাদাভাবে কপি করার প্রয়োজন হয় না। সিপিইউ মেমরিতে ডেটা কপি না করার ফলে, জিরো-কপি এন্ড-টু-এন্ড ল্যাটেন্সি উল্লেখযোগ্যভাবে কমাতে পারে।

নিম্নলিখিত কোডটি ভেক্টর গ্রাফিক্স রেন্ডার করার একটি এপিআই, OpenGL ব্যবহার করে জিরো-কপি জিপিইউ-এর একটি উদাহরণ বাস্তবায়ন। কোডটি ছবিগুলোকে OpenGL বাফার ফরম্যাটে সরাসরি LiteRT-এ পাঠায়:

// Suppose you have an OpenGL buffer consisting of:
// target (GLenum), id (GLuint), size_bytes (size_t), and offset (size_t)
// Load model and compile for GPU
LITERT_ASSIGN_OR_RETURN(auto env, Environment::Create({}));
LITERT_ASSIGN_OR_RETURN(auto compiled_model,
    CompiledModel::Create(env, "mymodel.tflite", kLiteRtHwAcceleratorGpu));

// Create a TensorBuffer that wraps the OpenGL buffer.
LITERT_ASSIGN_OR_RETURN(auto tensor_type, model.GetInputTensorType("input_tensor_name"));
LITERT_ASSIGN_OR_RETURN(auto gl_input_buffer, TensorBuffer::CreateFromGlBuffer(env,
    tensor_type, opengl_buffer.target, opengl_buffer.id, opengl_buffer.size_bytes, opengl_buffer.offset));
std::vector<TensorBuffer> input_buffers{gl_input_buffer};
LITERT_ASSIGN_OR_RETURN(auto output_buffers, compiled_model.CreateOutputBuffers());

// Execute
compiled_model.Run(input_buffers, output_buffers);

// If your output is also GPU-backed, you can fetch an OpenCL buffer or re-wrap it as an OpenGL buffer:
LITERT_ASSIGN_OR_RETURN(auto out_cl_buffer, output_buffers[0].GetOpenClBuffer());

অ্যাসিঙ্ক্রোনাস এক্সিকিউশন

LiteRT-এর RunAsync() এর মতো অ্যাসিঙ্ক্রোনাস মেথডগুলো আপনাকে CPU বা NPU ব্যবহার করে অন্যান্য কাজ চালিয়ে যাওয়ার পাশাপাশি GPU ইনফারেন্স শিডিউল করার সুযোগ দেয়। জটিল পাইপলাইনে, GPU প্রায়শই CPU বা NPU-এর পাশাপাশি অ্যাসিঙ্ক্রোনাসভাবে ব্যবহৃত হয়।

The following code snippet builds on the code provided in the Zero-copy GPU acceleration example. The code uses both CPU and GPU asynchronously and attaches a LiteRT Event to the input buffer. LiteRT Event is responsible for managing different types of synchronization primitives, and the following code creates a managed LiteRT Event object of type LiteRtEventTypeEglSyncFence . This Event object ensures that we don't read from the input buffer until the GPU is done. All this is done without involving the CPU.

LITERT_ASSIGN_OR_RETURN(auto env, Environment::Create({}));
LITERT_ASSIGN_OR_RETURN(auto compiled_model,
    CompiledModel::Create(env, "mymodel.tflite", kLiteRtHwAcceleratorGpu));

// 1. Prepare input buffer (OpenGL buffer)
LITERT_ASSIGN_OR_RETURN(auto gl_input,
    TensorBuffer::CreateFromGlBuffer(env, tensor_type, opengl_tex));
std::vector<TensorBuffer> inputs{gl_input};
LITERT_ASSIGN_OR_RETURN(auto outputs, compiled_model.CreateOutputBuffers());

// 2. If the GL buffer is in use, create and set an event object to synchronize with the GPU.
LITERT_ASSIGN_OR_RETURN(auto input_event,
    Event::CreateManagedEvent(env, LiteRtEventTypeEglSyncFence));
inputs[0].SetEvent(std::move(input_event));

// 3. Kick off the GPU inference
compiled_model.RunAsync(inputs, outputs);

// 4. Meanwhile, do other CPU work...
// CPU Stays busy ..

// 5. Access model output
std::vector<float> data(output_data_size);
outputs[0].Read<float>(absl::MakeSpan(data));

সমর্থিত ব্যাকএন্ড

LiteRT প্রতিটি প্ল্যাটফর্মের জন্য নিম্নলিখিত GPU ব্যাকএন্ড সমর্থন করে।

প্ল্যাটফর্ম ব্যাকএন্ড
অ্যান্ড্রয়েড ওপেনসিএল + ওপেনজিএল
লিনাক্স ওয়েবজিপিইউ (ভুলকান)
ম্যাকওএস ধাতু
উইন্ডোজ ওয়েবজিপিইউ (ডাইরেক্ট৩ডি)
অ্যান্ড্রয়েড ওপেনসিএল + ওপেনজিএল

সমর্থিত মডেল

LiteRT নিম্নলিখিত মডেলগুলিতে GPU অ্যাক্সিলারেশন সমর্থন করে। বেঞ্চমার্কের ফলাফল একটি Samsung Galaxy S24 ডিভাইসে চালানো পরীক্ষার উপর ভিত্তি করে তৈরি।

মডেল LiteRT GPU ত্বরণ LiteRT GPU (ms)
hf_mms_300m সম্পূর্ণরূপে অর্পিত ১৯.৬
hf_mobilevit_small সম্পূর্ণরূপে অর্পিত ৮.৭
hf_mobilevit_small_e2e সম্পূর্ণরূপে অর্পিত ৮.০
hf_wav2vec2_base_960h সম্পূর্ণরূপে অর্পিত ৯.১
hf_wav2vec2_base_960h_dynamic সম্পূর্ণরূপে অর্পিত ৯.৮
ইসনেট সম্পূর্ণরূপে অর্পিত ৪৩.১
টিম_এফিশিয়েন্টনেট সম্পূর্ণরূপে অর্পিত ৩.৭
টিম_এনএফনেট সম্পূর্ণরূপে অর্পিত ৯.৭
টিম_রেগনেটি_১২০ সম্পূর্ণরূপে অর্পিত ১২.১
টর্চঅডিও_ডিপস্পিচ সম্পূর্ণরূপে অর্পিত ৪.৬
torchaudio_wav2letter সম্পূর্ণরূপে অর্পিত ৪.৮
টর্চভিশন_অ্যালেক্সনেট সম্পূর্ণরূপে অর্পিত ৩.৩
torchvision_deeplabv3_mobilenet_v3_large সম্পূর্ণরূপে অর্পিত ৫.৭
টর্চভিশন_ডিপল্যাবভি৩_রেসনেট১০১ সম্পূর্ণরূপে অর্পিত ৩৫.১
টর্চভিশন_ডিপল্যাবভি৩_রেসনেট৫০ সম্পূর্ণরূপে অর্পিত ২৪.৫
টর্চভিশন_ডেনসনেট১২১ সম্পূর্ণরূপে অর্পিত ১৩.৯
টর্চভিশন_এফিশিয়েন্টনেট_বি০ সম্পূর্ণরূপে অর্পিত ৩.৬
টর্চভিশন_দক্ষনেট_বি১ সম্পূর্ণরূপে অর্পিত ৪.৭
টর্চভিশন_এফিশিয়েন্টনেট_বি২ সম্পূর্ণরূপে অর্পিত ৫.০
টর্চভিশন_এফিশিয়েন্টনেট_বি৩ সম্পূর্ণরূপে অর্পিত ৬.১
টর্চভিশন_এফিশিয়েন্টনেট_বি৪ সম্পূর্ণরূপে অর্পিত ৭.৬
টর্চভিশন_এফিশিয়েন্টনেট_বি৫ সম্পূর্ণরূপে অর্পিত ৮.৬
টর্চভিশন_এফিশিয়েন্টনেট_বি৬ সম্পূর্ণরূপে অর্পিত ১১.২
টর্চভিশন_এফিশিয়েন্টনেট_বি৭ সম্পূর্ণরূপে অর্পিত ১৪.৭
টর্চভিশন_এফসিএন_রেসনেট৫০ সম্পূর্ণরূপে অর্পিত ১৯.৯
টর্চভিশন_গুগলনেট সম্পূর্ণরূপে অর্পিত ৩.৯
টর্চভিশন_ইনসেপশন_ভি৩ সম্পূর্ণরূপে অর্পিত ৮.৬
torchvision_lraspp_mobilenet_v3_large সম্পূর্ণরূপে অর্পিত ৩.৩
torchvision_mnasnet0_5 সম্পূর্ণরূপে অর্পিত ২.৪
টর্চভিশন_মোবাইলনেট_ভি২ সম্পূর্ণরূপে অর্পিত ২.৮
torchvision_mobilenet_v3_large সম্পূর্ণরূপে অর্পিত ২.৮
torchvision_mobilenet_v3_small সম্পূর্ণরূপে অর্পিত ২.৩
টর্চভিশন_রেসনেট১৫২ সম্পূর্ণরূপে অর্পিত ১৫.০
টর্চভিশন_রেসনেট১৮ সম্পূর্ণরূপে অর্পিত ৪.৩
টর্চভিশন_রেসনেট৫০ সম্পূর্ণরূপে অর্পিত ৬.৯
torchvision_squeezenet1_0 সম্পূর্ণরূপে অর্পিত ২.৯
torchvision_squeezenet1_1 সম্পূর্ণরূপে অর্পিত ২.৫
টর্চভিশন_ভিজিজি১৬ সম্পূর্ণরূপে অর্পিত ১৩.৪
টর্চভিশন_ওয়াইড_রেসনেট১০১_২ সম্পূর্ণরূপে অর্পিত ২৫.০
টর্চভিশন_ওয়াইড_রেসনেট৫০_২ সম্পূর্ণরূপে অর্পিত ১৩.৪
u2net_full সম্পূর্ণরূপে অর্পিত ৯৮.৩
u2net_lite সম্পূর্ণরূপে অর্পিত ৫১.৪
hf_distil_whisper_small_no_cache আংশিকভাবে অর্পিত ২৫১.৯
hf_distilbert আংশিকভাবে অর্পিত ১৩.৭
hf_tinyroberta_squad2 আংশিকভাবে অর্পিত ১৭.১
hf_tinyroberta_squad2_dynamic_batch আংশিকভাবে অর্পিত ৫২.১
snapml_StyleTransferNet আংশিকভাবে অর্পিত ৪০.৯
timm_efficientformer_l1 আংশিকভাবে অর্পিত ১৭.৬
timm_efficientformerv2_s0 আংশিকভাবে অর্পিত ১৬.১
timm_pvt_v2_b1 আংশিকভাবে অর্পিত ৭৩.৫
timm_pvt_v2_b3 আংশিকভাবে অর্পিত ২৪৬.৭
timm_resnest14d আংশিকভাবে অর্পিত ৮৮.৯
টর্চঅডিও_কনফর্মার আংশিকভাবে অর্পিত ২১.৫
টর্চভিশন_কনভনেক্সট_টাইনি আংশিকভাবে অর্পিত ৮.২
টর্চভিশন_ম্যাক্সভিট_টি আংশিকভাবে অর্পিত ১৯৪.০
টর্চভিশন_শাফেলনেট_ভি২ আংশিকভাবে অর্পিত ৯.৫
টর্চভিশন_সুইং_টাইনি আংশিকভাবে অর্পিত ১৬৪.৪
torchvision_video_resnet2plus1d_18 আংশিকভাবে অর্পিত ৬৮৩২.০
torchvision_video_swin3d_tiny আংশিকভাবে অর্পিত ২৬১৭.৮
yolox_tiny আংশিকভাবে অর্পিত ১১.২