অ্যান্ড্রয়েডের জন্য এলএলএম ইনফারেন্স গাইড

LLM ইনফারেন্স API আপনাকে Android অ্যাপ্লিকেশনগুলির জন্য সম্পূর্ণরূপে ডিভাইসে বড় ভাষা মডেলগুলি (LLMs) চালাতে দেয়, যা আপনি পাঠ্য তৈরি করা, প্রাকৃতিক ভাষা আকারে তথ্য পুনরুদ্ধার করা এবং নথির সংক্ষিপ্তসারের মতো বিস্তৃত কাজ সম্পাদন করতে ব্যবহার করতে পারেন। টাস্কটি একাধিক টেক্সট-টু-টেক্সট বড় ভাষার মডেলের জন্য অন্তর্নির্মিত সমর্থন প্রদান করে, যাতে আপনি আপনার অ্যান্ড্রয়েড অ্যাপগুলিতে সর্বশেষ অন-ডিভাইস জেনারেটিভ এআই মডেলগুলি প্রয়োগ করতে পারেন।

কাজটি জেমার নিম্নলিখিত রূপগুলিকে সমর্থন করে: জেমা-2 2B, জেমা 2B, এবং জেমা 7B৷ Gemma হল হালকা ওজনের, অত্যাধুনিক ওপেন মডেলের একটি পরিবার যা জেমিনি মডেল তৈরি করতে ব্যবহৃত একই গবেষণা এবং প্রযুক্তি থেকে তৈরি। এটি নিম্নলিখিত বাহ্যিক মডেলগুলিকেও সমর্থন করে: Phi-2 , Falcon-RW-1B এবং StableLM-3B

সমর্থিত মডেলগুলি ছাড়াও, ব্যবহারকারীরা PyTorch মডেলগুলিকে মাল্টি-সিগনেচার LiteRT ( tflite ) মডেলগুলিতে রপ্তানি করতে Google-এর AI এজ টর্চ ব্যবহার করতে পারেন, যা LLM ইনফারেন্স API-এর সাথে সামঞ্জস্যপূর্ণ টাস্ক বান্ডেলগুলি তৈরি করতে টোকেনাইজার পরামিতিগুলির সাথে একত্রিত হয়৷

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

কোড উদাহরণ

এই নির্দেশিকাটি Android এর জন্য একটি মৌলিক পাঠ্য প্রজন্মের অ্যাপের একটি উদাহরণ উল্লেখ করে৷ আপনি অ্যাপটিকে আপনার নিজের অ্যান্ড্রয়েড অ্যাপের জন্য একটি সূচনা পয়েন্ট হিসাবে ব্যবহার করতে পারেন, বা একটি বিদ্যমান অ্যাপ পরিবর্তন করার সময় এটি উল্লেখ করতে পারেন। উদাহরণ কোডটি গিটহাবে হোস্ট করা হয়েছে।

কোডটি ডাউনলোড করুন

নিম্নলিখিত নির্দেশাবলী আপনাকে দেখায় কিভাবে গিট কমান্ড লাইন টুল ব্যবহার করে উদাহরণ কোডের একটি স্থানীয় অনুলিপি তৈরি করতে হয়।

উদাহরণ কোড ডাউনলোড করতে:

  1. নিম্নলিখিত কমান্ড ব্যবহার করে গিট সংগ্রহস্থল ক্লোন করুন:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. ঐচ্ছিকভাবে, স্পার্স চেকআউট ব্যবহার করার জন্য আপনার গিট ইন্সট্যান্স কনফিগার করুন, তাই আপনার কাছে শুধুমাত্র এলএলএম ইনফারেন্স এপিআই উদাহরণ অ্যাপের ফাইল আছে:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/llm_inference/android
    

উদাহরণ কোডের একটি স্থানীয় সংস্করণ তৈরি করার পরে, আপনি প্রকল্পটি অ্যান্ড্রয়েড স্টুডিওতে আমদানি করতে এবং অ্যাপটি চালাতে পারেন। নির্দেশাবলীর জন্য, Android এর জন্য সেটআপ গাইড দেখুন।

সেটআপ

এই বিভাগটি আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট এবং কোড প্রোজেক্ট সেট আপ করার জন্য বিশেষভাবে LLM ইনফারেন্স API ব্যবহার করার জন্য মূল ধাপগুলি বর্ণনা করে। প্ল্যাটফর্ম সংস্করণ প্রয়োজনীয়তা সহ MediaPipe কার্যগুলি ব্যবহার করার জন্য আপনার বিকাশের পরিবেশ সেট আপ করার বিষয়ে সাধারণ তথ্যের জন্য, Android এর জন্য সেটআপ নির্দেশিকা দেখুন৷

নির্ভরতা

LLM ইনফারেন্স API com.google.mediapipe:tasks-genai লাইব্রেরি ব্যবহার করে। আপনার Android অ্যাপের build.gradle ফাইলে এই নির্ভরতা যোগ করুন:

dependencies {
    implementation 'com.google.mediapipe:tasks-genai:0.10.14'
}

Android 12 (API 31) বা উচ্চতর ডিভাইসগুলির জন্য, নেটিভ OpenCL লাইব্রেরি নির্ভরতা যোগ করুন। আরও তথ্যের জন্য, uses-native-library ট্যাগের ডকুমেন্টেশন দেখুন।

AndroidManifest.xml ফাইলে নিম্নলিখিত uses-native-library ট্যাগ যোগ করুন:

<uses-native-library android:name="libOpenCL.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-car.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-pixel.so" android:required="false"/>

মডেল

MediaPipe LLM ইনফারেন্স API-এর জন্য একটি প্রশিক্ষিত টেক্সট-টু-টেক্সট ভাষা মডেল প্রয়োজন যা এই কাজের সাথে সামঞ্জস্যপূর্ণ। একটি মডেল ডাউনলোড করার পরে, প্রয়োজনীয় নির্ভরতাগুলি ইনস্টল করুন এবং মডেলটিকে অ্যান্ড্রয়েড ডিভাইসে পুশ করুন। আপনি যদি জেমা ছাড়া অন্য কোনো মডেল ব্যবহার করেন, তাহলে আপনাকে মডেলটিকে মিডিয়াপাইপের সাথে সামঞ্জস্যপূর্ণ ফর্ম্যাটে রূপান্তর করতে হবে।

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

একটি মডেল ডাউনলোড করুন

এলএলএম ইনফারেন্স এপিআই শুরু করার আগে, সমর্থিত মডেলগুলির একটি ডাউনলোড করুন এবং আপনার প্রকল্প ডিরেক্টরির মধ্যে ফাইলটি সংরক্ষণ করুন:

  • Gemma-2 2B : মডেলের জেমা পরিবারের সর্বশেষ সংস্করণ। মিথুন মডেলগুলি তৈরি করতে ব্যবহৃত একই গবেষণা এবং প্রযুক্তি থেকে তৈরি হালকা ওজনের, অত্যাধুনিক ওপেন মডেলগুলির একটি পরিবারের অংশ৷
  • জেমিনি মডেল তৈরি করতে ব্যবহৃত একই গবেষণা এবং প্রযুক্তি থেকে তৈরি হালকা ওজনের, অত্যাধুনিক ওপেন মডেলের একটি পরিবারের অংশ। প্রশ্ন উত্তর, সংক্ষিপ্তকরণ এবং যুক্তি সহ পাঠ্য তৈরির বিভিন্ন কাজের জন্য উপযুক্ত।
  • Phi-2 : 2.7 বিলিয়ন প্যারামিটার ট্রান্সফরমার মডেল, প্রশ্ন-উত্তর, চ্যাট এবং কোড ফর্ম্যাটের জন্য সবচেয়ে উপযুক্ত।
  • Falcon-RW-1B : RefinedWeb- এর 350B টোকেনগুলিতে প্রশিক্ষিত 1 বিলিয়ন প্যারামিটার কার্যকারণ ডিকোডার-শুধু মডেল৷
  • StableLM-3B : 3 বিলিয়ন প্যারামিটার ডিকোডার-শুধু ভাষা মডেল বিভিন্ন ইংরেজি এবং কোড ডেটাসেটের 1 ট্রিলিয়ন টোকেনগুলিতে প্রাক-প্রশিক্ষিত।

সমর্থিত মডেলগুলি ছাড়াও, আপনি PyTorch মডেলগুলিকে বহু-স্বাক্ষর LiteRT ( tflite ) মডেলগুলিতে রপ্তানি করতে Google এর AI এজ টর্চ ব্যবহার করতে পারেন৷ আরও তথ্যের জন্য, পাইটর্চ মডেলের জন্য টর্চ জেনারেটিভ কনভার্টার দেখুন।

আমরা Gemma-2 2B ব্যবহার করার পরামর্শ দিই, যা Kaggle মডেলগুলিতে পাওয়া যায়। অন্যান্য উপলব্ধ মডেল সম্পর্কে আরও তথ্যের জন্য, টাস্ক ওভারভিউ মডেল বিভাগটি দেখুন।

মিডিয়াপাইপ ফর্ম্যাটে মডেল রূপান্তর করুন

LLM ইনফারেন্স API দুটি বিভাগের ধরণের মডেলের সাথে সামঞ্জস্যপূর্ণ, যার মধ্যে কিছু মডেল রূপান্তর প্রয়োজন। আপনার মডেলের জন্য প্রয়োজনীয় পদক্ষেপ পদ্ধতি সনাক্ত করতে টেবিলটি ব্যবহার করুন।

মডেল রূপান্তর পদ্ধতি সামঞ্জস্যপূর্ণ প্ল্যাটফর্ম ফাইলের ধরন
সমর্থিত মডেল Gemma 2B, Gemma 7B, Gemma-2 2B, Phi-2, StableLM, Falcon মিডিয়াপাইপ অ্যান্ড্রয়েড, আইওএস, ওয়েব .বিন
অন্যান্য PyTorch মডেল সমস্ত PyTorch LLM মডেল এআই এজ টর্চ জেনারেটিভ লাইব্রেরি অ্যান্ড্রয়েড, আইওএস .টাস্ক

আমরা Kaggle-এ Gemma 2B, Gemma 7B, এবং Gemma-2 2B-এর জন্য রূপান্তরিত .bin ফাইলগুলি হোস্ট করছি। এই মডেলগুলি সরাসরি আমাদের LLM ইনফারেন্স API ব্যবহার করে স্থাপন করা যেতে পারে। আপনি কীভাবে অন্যান্য মডেলগুলিকে রূপান্তর করতে পারেন তা জানতে, মডেল রূপান্তর বিভাগটি দেখুন৷

ডিভাইসে মডেল পুশ করুন

output_path ফোল্ডারের বিষয়বস্তুকে অ্যান্ড্রয়েড ডিভাইসে পুশ করুন।

$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push output_path /data/local/tmp/llm/model_version.bin

টাস্ক তৈরি করুন

MediaPipe LLM ইনফারেন্স API টাস্ক সেট আপ করতে createFromOptions() ফাংশন ব্যবহার করে। createFromOptions() ফাংশন কনফিগারেশন বিকল্পের জন্য মান গ্রহণ করে। কনফিগারেশন বিকল্প সম্পর্কে আরও তথ্যের জন্য, কনফিগারেশন বিকল্পগুলি দেখুন।

নিম্নলিখিত কোডটি মৌলিক কনফিগারেশন বিকল্পগুলি ব্যবহার করে কাজটি শুরু করে:

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPATH('/data/local/.../')
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

কনফিগারেশন বিকল্প

একটি Android অ্যাপ সেট আপ করতে নিম্নলিখিত কনফিগারেশন বিকল্পগুলি ব্যবহার করুন:

বিকল্পের নাম বর্ণনা মান পরিসীমা ডিফল্ট মান
modelPath প্রজেক্ট ডিরেক্টরির মধ্যে মডেলটি যেখানে সংরক্ষণ করা হয় তার পথ। PATH N/A
maxTokens মডেলটি পরিচালনা করে সর্বাধিক সংখ্যক টোকেন (ইনপুট টোকেন + আউটপুট টোকেন)। পূর্ণসংখ্যা 512
topK প্রজন্মের প্রতিটি ধাপে মডেলটি বিবেচনা করে টোকেনের সংখ্যা। পূর্বাভাসগুলিকে শীর্ষ k সর্বাধিক সম্ভাব্য টোকেনে সীমাবদ্ধ করে৷ পূর্ণসংখ্যা 40
temperature প্রজন্মের সময় যে পরিমাণ এলোমেলোভাবে প্রবর্তিত হয়। একটি উচ্চ তাপমাত্রার ফলে উত্পন্ন পাঠে আরও সৃজনশীলতা আসে, যখন নিম্ন তাপমাত্রা আরও অনুমানযোগ্য প্রজন্ম তৈরি করে। ভাসা 0.8
randomSeed টেক্সট তৈরির সময় ব্যবহৃত এলোমেলো বীজ। পূর্ণসংখ্যা 0
loraPath ডিভাইসে স্থানীয়ভাবে LoRA মডেলের পরম পথ। দ্রষ্টব্য: এটি শুধুমাত্র GPU মডেলের সাথে সামঞ্জস্যপূর্ণ। PATH N/A
resultListener ফলাফল শ্রোতাকে অ্যাসিঙ্ক্রোনাসভাবে ফলাফল পেতে সেট করে। অ্যাসিঙ্ক জেনারেশন পদ্ধতি ব্যবহার করার সময় শুধুমাত্র প্রযোজ্য। N/A N/A
errorListener একটি ঐচ্ছিক ত্রুটি শ্রোতা সেট করে। N/A N/A

ডেটা প্রস্তুত করুন

LLM ইনফারেন্স API নিম্নলিখিত ইনপুটগুলি গ্রহণ করে:

  • প্রম্পট (স্ট্রিং): একটি প্রশ্ন বা প্রম্পট।
val inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."

টাস্ক চালান

পূর্ববর্তী বিভাগে ( inputPrompt ) দেওয়া ইনপুট পাঠ্যের একটি পাঠ্য প্রতিক্রিয়া তৈরি করতে generateResponse() পদ্ধতি ব্যবহার করুন। এটি একটি একক উত্পন্ন প্রতিক্রিয়া তৈরি করে।

val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")

প্রতিক্রিয়া স্ট্রিম করতে, generateResponseAsync() পদ্ধতি ব্যবহার করুন।

val options = LlmInference.LlmInferenceOptions.builder()
  ...
  .setResultListener { partialResult, done ->
    logger.atInfo().log("partial result: $partialResult")
  }
  .build()

llmInference.generateResponseAsync(inputPrompt)

হ্যান্ডেল এবং প্রদর্শন ফলাফল

LLM ইনফারেন্স API একটি LlmInferenceResult প্রদান করে, যার মধ্যে জেনারেট করা প্রতিক্রিয়া পাঠ্য রয়েছে।

Here's a draft you can use:

Subject: Lunch on Saturday Reminder

Hi Brett,

Just a quick reminder about our lunch plans this Saturday at noon.
Let me know if that still works for you.

Looking forward to it!

Best,
[Your Name]

LoRA মডেল কাস্টমাইজেশন

মিডিয়াপাইপ এলএলএম ইনফারেন্স এপিআই বৃহৎ ভাষার মডেলের জন্য নিম্ন-র্যাঙ্ক অ্যাডাপ্টেশন (LoRA) সমর্থন করার জন্য কনফিগার করা যেতে পারে। সূক্ষ্ম-টিউনড LoRA মডেলগুলি ব্যবহার করে, বিকাশকারীরা একটি ব্যয়-কার্যকর প্রশিক্ষণ প্রক্রিয়ার মাধ্যমে LLM-এর আচরণ কাস্টমাইজ করতে পারে।

LLM ইনফারেন্স API-এর LoRA সমর্থন সমস্ত Gemma ভেরিয়েন্ট এবং GPU ব্যাকএন্ডের জন্য Phi-2 মডেলের জন্য কাজ করে, LoRA ওজন শুধুমাত্র মনোযোগ স্তরগুলিতে প্রযোজ্য। এই প্রাথমিক বাস্তবায়ন ভবিষ্যতের উন্নয়নের জন্য একটি পরীক্ষামূলক API হিসাবে কাজ করে যাতে আগামী আপডেটগুলিতে আরও মডেল এবং বিভিন্ন ধরণের স্তর সমর্থন করার পরিকল্পনা রয়েছে।

LoRA মডেল প্রস্তুত করুন

আপনার নিজস্ব ডেটাসেটে সমর্থিত মডেলের ধরন, জেমা বা ফি-২ সহ একটি সূক্ষ্ম টিউন করা LoRA মডেল প্রশিক্ষণের জন্য HuggingFace-এর নির্দেশাবলী অনুসরণ করুন। Gemma-2 2B , Gemma 2B এবং Phi-2 মডেল দুটিই সেফটেনসর ফরম্যাটে HuggingFace-এ উপলব্ধ। যেহেতু LLM ইনফারেন্স API শুধুমাত্র মনোযোগের স্তরগুলিতে LoRA সমর্থন করে, তাই LoraConfig তৈরি করার সময় নিম্নলিখিত হিসাবে শুধুমাত্র মনোযোগ স্তরগুলি নির্দিষ্ট করুন:

# For Gemma
from peft import LoraConfig
config = LoraConfig(
    r=LORA_RANK,
    target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
)

# For Phi-2
config = LoraConfig(
    r=LORA_RANK,
    target_modules=["q_proj", "v_proj", "k_proj", "dense"],
)

পরীক্ষার জন্য, সর্বজনীনভাবে অ্যাক্সেসযোগ্য ফাইন-টিউনড LoRA মডেল রয়েছে যা HuggingFace-এ উপলব্ধ LLM ইনফারেন্স API-এর সাথে মানানসই। উদাহরণস্বরূপ, Gemma-2B-এর জন্য monsterapi/gemma-2b-lora-maths-orca-200k এবং Phi-2-এর জন্য lole25/phi-2-sft-ultrachat-lora

প্রস্তুতকৃত ডেটাসেটের প্রশিক্ষণ এবং মডেলটি সংরক্ষণ করার পরে, আপনি একটি adapter_model.safetensors ফাইল পাবেন যাতে সূক্ষ্ম-টিউন করা LoRA মডেলের ওজন রয়েছে। সেফটেনসর ফাইলটি মডেল রূপান্তরে ব্যবহৃত LoRA চেকপয়েন্ট।

পরবর্তী ধাপ হিসেবে, আপনাকে মিডিয়াপাইপ পাইথন প্যাকেজ ব্যবহার করে মডেলের ওজনকে টেনসরফ্লো লাইট ফ্ল্যাটবাফারে রূপান্তর করতে হবে। ConversionConfig এ বেস মডেলের বিকল্পগুলির পাশাপাশি অতিরিক্ত LoRA বিকল্পগুলি উল্লেখ করা উচিত। লক্ষ্য করুন যে যেহেতু API শুধুমাত্র GPU এর সাথে LoRA অনুমান সমর্থন করে, তাই ব্যাকএন্ড অবশ্যই 'gpu' তে সেট করতে হবে।

import mediapipe as mp
from mediapipe.tasks.python.genai import converter

config = converter.ConversionConfig(
  # Other params related to base model
  ...
  # Must use gpu backend for LoRA conversion
  backend='gpu',
  # LoRA related params
  lora_ckpt=LORA_CKPT,
  lora_rank=LORA_RANK,
  lora_output_tflite_file=LORA_OUTPUT_TFLITE_FILE,
)

converter.convert_checkpoint(config)

রূপান্তরকারী দুটি TFLite ফ্ল্যাটবাফার ফাইল আউটপুট করবে, একটি বেস মডেলের জন্য এবং অন্যটি LoRA মডেলের জন্য।

LoRA মডেল অনুমান

ওয়েব, অ্যান্ড্রয়েড এবং আইওএস এলএলএম ইনফারেন্স API LoRA মডেল অনুমান সমর্থন করার জন্য আপডেট করা হয়েছে।

আরম্ভ করার সময় অ্যান্ড্রয়েড স্ট্যাটিক LoRA সমর্থন করে। একটি LoRA মডেল লোড করতে, ব্যবহারকারীরা LoRA মডেল পাথের পাশাপাশি বেস LLM নির্দিষ্ট করে।

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath('<path to base model>')
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .setLoraPath('<path to LoRA model>')
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

LoRA এর সাথে LLM অনুমান চালানোর জন্য, বেস মডেল হিসাবে একই generateResponse() বা generateResponseAsync() পদ্ধতি ব্যবহার করুন।