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

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

আপনার ওয়েব অ্যাপ্লিকেশনে দ্রুত LLM ইনফারেন্স API যোগ করতে, Quickstart অনুসরণ করুন। LLM ইনফারেন্স API চালানোর জন্য একটি ওয়েব অ্যাপ্লিকেশনের একটি মৌলিক উদাহরণের জন্য, নমুনা অ্যাপ্লিকেশনটি দেখুন। LLM ইনফারেন্স API কীভাবে কাজ করে সে সম্পর্কে আরও গভীরভাবে বোঝার জন্য, কনফিগারেশন বিকল্পগুলি , মডেল রূপান্তর এবং LoRA টিউনিং বিভাগগুলি দেখুন।

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

দ্রুত শুরু

আপনার ওয়েব অ্যাপ্লিকেশনে LLM ইনফারেন্স API যোগ করতে নিম্নলিখিত ধাপগুলি অনুসরণ করুন। LLM ইনফারেন্স API-এর জন্য WebGPU সামঞ্জস্যপূর্ণ একটি ওয়েব ব্রাউজার প্রয়োজন। সামঞ্জস্যপূর্ণ ব্রাউজারগুলির সম্পূর্ণ তালিকার জন্য, GPU ব্রাউজার সামঞ্জস্যতা দেখুন।

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

LLM ইনফারেন্স API @mediapipe/tasks-genai প্যাকেজ ব্যবহার করে।

স্থানীয় স্টেজিংয়ের জন্য প্রয়োজনীয় প্যাকেজগুলি ইনস্টল করুন:

npm install @mediapipe/tasks-genai

সার্ভারে স্থাপন করতে, jsDelivr এর মতো একটি কন্টেন্ট ডেলিভারি নেটওয়ার্ক (CDN) পরিষেবা ব্যবহার করে সরাসরি আপনার HTML পৃষ্ঠায় কোড যোগ করুন:

<head>
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai/genai_bundle.cjs"
    crossorigin="anonymous"></script>
</head>

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

HuggingFace থেকে Gemma-3n E4B অথবা E2B ডাউনলোড করুন। "-Web" নামে মডেলগুলি বিশেষভাবে ওয়েব ব্যবহারের জন্য রূপান্তরিত হয়, তাই সর্বদা এইগুলির মধ্যে একটি ব্যবহার করার পরামর্শ দেওয়া হয়।

উপলব্ধ মডেলগুলি সম্পর্কে আরও তথ্যের জন্য, মডেল ডকুমেন্টেশন দেখুন, অথবা আমাদের HuggingFace কমিউনিটি পৃষ্ঠাটি ব্রাউজ করুন, যা ডকুমেন্টেশনে অন্তর্ভুক্ত নয় এমন বেশ কয়েকটি অতিরিক্ত Gemma 3 ভেরিয়েন্ট অফার করে, কিন্তু যেগুলি বিশেষভাবে ওয়েবের জন্য রূপান্তরিত করা হয়েছে, যেমন 270M , 4B , 12B , 27B , এবং MedGemma-27B-Text

আপনার প্রকল্প ডিরেক্টরির মধ্যে মডেলটি সংরক্ষণ করুন:

<dev-project-root>/assets/gemma-3n-E4B-it-int4-Web.litertlm

baseOptions অবজেক্ট modelAssetPath প্যারামিটার ব্যবহার করে মডেলের পাথ নির্দিষ্ট করুন:

baseOptions: { modelAssetPath: `/assets/gemma-3n-E4B-it-int4-Web.litertlm`}

টাস্কটি শুরু করুন

মৌলিক কনফিগারেশন বিকল্পগুলি দিয়ে কাজটি শুরু করুন:

const genai = await FilesetResolver.forGenAiTasks(
    // path/to/wasm/root
    "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
llmInference = await LlmInference.createFromOptions(genai, {
    baseOptions: {
        modelAssetPath: '/assets/gemma-3n-E4B-it-int4-Web.litertlm'
    },
    maxTokens: 1000,
    topK: 40,
    temperature: 0.8,
    randomSeed: 101
});

টাস্কটি চালান

অনুমান ট্রিগার করতে generateResponse() ফাংশন ব্যবহার করুন।

const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;

প্রতিক্রিয়া স্ট্রিম করতে, নিম্নলিখিতগুলি ব্যবহার করুন:

llmInference.generateResponse(
  inputPrompt,
  (partialResult, done) => {
        document.getElementById('output').textContent += partialResult;
});

মাল্টিমোডাল প্রম্পটিং

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

শুরু করতে, MediaPipe- এবং ওয়েব-সামঞ্জস্যপূর্ণ ফর্ম্যাটে Gemma-3n E4B অথবা Gemma-3n E2B ব্যবহার করুন। আরও তথ্যের জন্য, Gemma-3n ডকুমেন্টেশন দেখুন।

ভিশন সাপোর্ট সক্ষম করতে, নিশ্চিত করুন যে maxNumImages একটি ধনাত্মক মানে সেট করা আছে। এটি নির্ধারণ করে যে LLM একটি একক প্রম্পটে সর্বাধিক কতগুলি চিত্রের টুকরো প্রক্রিয়া করতে পারে।

অডিও সাপোর্ট সক্রিয় করতে, supportAudio true তে সেট করা আছে কিনা তা নিশ্চিত করুন।

llmInference = await LlmInference.createFromOptions(genai, {
    baseOptions: {
        modelAssetPath: '/assets/gemma-3n-E4B-it-int4-Web.litertlm'
    },
    maxTokens: 1000,
    topK: 40,
    temperature: 0.8,
    randomSeed: 101,
    maxNumImages: 5,
    supportAudio: true,
});

এখন আগের মতোই প্রতিক্রিয়া তৈরি করা যেতে পারে, তবে স্ট্রিং, ছবি এবং অডিও ডেটার একটি ক্রমানুসারে অ্যারে ব্যবহার করে:

const response = await llmInference.generateResponse([
  '<start_of_turn>user\n',
  'Describe ',
  {imageSource: '/assets/test_image.png'},
  ' and then transcribe ',
  {audioSource: '/assets/test_audio.wav'},
  '<end_of_turn>\n<start_of_turn>model\n',
]);

ভিশনের জন্য, ছবির URL এবং সবচেয়ে সাধারণ ছবি, ভিডিও, অথবা ক্যানভাস অবজেক্ট সমর্থিত। অডিওর জন্য, শুধুমাত্র একক-চ্যানেল অডিওবাফার এবং মনো-চ্যানেল অডিও ফাইল URL সমর্থিত। সোর্স কোড ব্রাউজ করে আরও বিশদ পাওয়া যাবে।

নমুনা আবেদন

নমুনা অ্যাপ্লিকেশনটি ওয়েবের জন্য একটি মৌলিক টেক্সট জেনারেশন অ্যাপের উদাহরণ, যা LLM ইনফারেন্স API ব্যবহার করে। আপনি আপনার নিজস্ব ওয়েব অ্যাপের জন্য একটি সূচনা বিন্দু হিসাবে অ্যাপটি ব্যবহার করতে পারেন, অথবা বিদ্যমান অ্যাপটি পরিবর্তন করার সময় এটি ব্যবহার করতে পারেন। উদাহরণ কোডটি GitHub এ হোস্ট করা আছে।

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

git clone https://github.com/google-ai-edge/mediapipe-samples

আরও তথ্যের জন্য, ওয়েবের জন্য সেটআপ গাইড দেখুন।

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

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

বিকল্পের নাম বিবরণ মূল্য পরিসীমা ডিফল্ট মান
modelPath প্রকল্প ডিরেক্টরির মধ্যে মডেলটি যেখানে সংরক্ষণ করা হয় তার পথ। পথ নিষিদ্ধ
maxTokens মডেলটি সর্বোচ্চ কত সংখ্যক টোকেন (ইনপুট টোকেন + আউটপুট টোকেন) পরিচালনা করে। পূর্ণসংখ্যা ৫১২
topK প্রজন্মের প্রতিটি ধাপে মডেলটি কত টোকেন বিবেচনা করে। ভবিষ্যদ্বাণীগুলিকে শীর্ষ k সর্বাধিক সম্ভাব্য টোকেনগুলিতে সীমাবদ্ধ করে। পূর্ণসংখ্যা ৪০
temperature প্রজন্মের সময় যে পরিমাণ এলোমেলোতা প্রবর্তিত হয়। উচ্চ তাপমাত্রার ফলে উৎপন্ন লেখায় আরও সৃজনশীলতা দেখা দেয়, অন্যদিকে কম তাপমাত্রার ফলে আরও অনুমানযোগ্য প্রজন্ম তৈরি হয়। ভাসা ০.৮
randomSeed টেক্সট তৈরির সময় ব্যবহৃত এলোমেলো বীজ। পূর্ণসংখ্যা 0
loraRanks রানটাইম চলাকালীন LoRA মডেলগুলি LoRA র‍্যাঙ্ক ব্যবহার করবে। দ্রষ্টব্য: এটি শুধুমাত্র GPU মডেলগুলির সাথে সামঞ্জস্যপূর্ণ। পূর্ণসংখ্যা অ্যারে নিষিদ্ধ

মডেল রূপান্তর

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

মডেল রূপান্তর পদ্ধতি সামঞ্জস্যপূর্ণ প্ল্যাটফর্ম ফাইলের ধরণ
জেমা-৩ ১বি কোন রূপান্তর প্রয়োজন নেই অ্যান্ড্রয়েড, ওয়েব .টাস্ক
Gemma 2B, Gemma 7B, Gemma-2 2B কোন রূপান্তর প্রয়োজন নেই অ্যান্ড্রয়েড, আইওএস, ওয়েব .বিন
ফাই-২, স্টেবলএলএম, ফ্যালকন মিডিয়াপাইপ রূপান্তর স্ক্রিপ্ট অ্যান্ড্রয়েড, আইওএস, ওয়েব .বিন
সকল পাইটর্চ এলএলএম মডেল LiterRT টর্চ জেনারেটিভ লাইব্রেরি অ্যান্ড্রয়েড, আইওএস .টাস্ক

অন্যান্য মডেল কীভাবে রূপান্তর করবেন তা জানতে, মডেল রূপান্তর বিভাগটি দেখুন।

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

LLM ইনফারেন্স API PEFT (প্যারামিটার-এফিশিয়েন্ট ফাইন-টিউনিং) লাইব্রেরি ব্যবহার করে LoRA (লো-র‍্যাঙ্ক অ্যাডাপ্টেশন) টিউনিং সমর্থন করে। LoRA টিউনিং একটি সাশ্রয়ী প্রশিক্ষণ প্রক্রিয়ার মাধ্যমে LLM-এর আচরণকে কাস্টমাইজ করে, পুরো মডেলটিকে পুনরায় প্রশিক্ষণ দেওয়ার পরিবর্তে নতুন প্রশিক্ষণ ডেটার উপর ভিত্তি করে প্রশিক্ষণযোগ্য ওজনের একটি ছোট সেট তৈরি করে।

LLM ইনফারেন্স API Gemma-2 2B , Gemma 2B এবং Phi-2 মডেলের মনোযোগ স্তরগুলিতে LoRA ওজন যোগ করার সুবিধা প্রদান করে। safetensors ফর্ম্যাটে মডেলটি ডাউনলোড করুন।

LoRA ওয়েট তৈরি করার জন্য বেস মডেলটি অবশ্যই safetensors ফর্ম্যাটে থাকতে হবে। LoRA প্রশিক্ষণের পরে, আপনি মিডিয়াপাইপে চালানোর জন্য মডেলগুলিকে FlatBuffers ফর্ম্যাটে রূপান্তর করতে পারেন।

LoRA ওজন প্রস্তুত করুন

আপনার নিজস্ব ডেটাসেটে একটি সূক্ষ্ম-সুরযুক্ত LoRA মডেল প্রশিক্ষণের জন্য PEFT এর LoRA পদ্ধতি নির্দেশিকা ব্যবহার করুন।

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 মডেলের ওজন adapter_model.safetensors এ পাওয়া যায়। safetensors ফাইলটি হল মডেল রূপান্তরের সময় ব্যবহৃত LoRA চেকপয়েন্ট।

মডেল রূপান্তর

মডেলের ওজনগুলিকে Flatbuffer ফর্ম্যাটে রূপান্তর করতে MediaPipe Python প্যাকেজ ব্যবহার করুন। ConversionConfig অতিরিক্ত LoRA বিকল্পগুলির সাথে বেস মডেল বিকল্পগুলি নির্দিষ্ট করে।

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_FILE,
)

converter.convert_checkpoint(config)

কনভার্টারটি দুটি মিডিয়াপাইপ-সামঞ্জস্যপূর্ণ ফাইল তৈরি করবে, একটি বেস মডেলের জন্য এবং অন্যটি LoRA মডেলের জন্য।

LoRA মডেলের অনুমান

ওয়েব রানটাইম চলাকালীন গতিশীল LoRA সমর্থন করে, যার অর্থ ব্যবহারকারীরা ইনিশিয়ালাইজেশনের সময় LoRA র‍্যাঙ্ক ঘোষণা করে। এর অর্থ হল আপনি রানটাইম চলাকালীন বিভিন্ন LoRA মডেল অদলবদল করতে পারবেন।

const genai = await FilesetResolver.forGenAiTasks(
    // path/to/wasm/root
    "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
const llmInference = await LlmInference.createFromOptions(genai, {
    // options for the base model
    ...
    // LoRA ranks to be used by the LoRA models during runtime
    loraRanks: [4, 8, 16]
});

বেস মডেলটি শুরু করার পরে রানটাইমের সময় LoRA মডেলগুলি লোড করুন। LLM প্রতিক্রিয়া তৈরি করার সময় মডেল রেফারেন্সটি পাস করে LoRA মডেলটি ট্রিগার করুন।

// Load several LoRA models. The returned LoRA model reference is used to specify
// which LoRA model to be used for inference.
loraModelRank4 = await llmInference.loadLoraModel(loraModelRank4Url);
loraModelRank8 = await llmInference.loadLoraModel(loraModelRank8Url);

// Specify LoRA model to be used during inference
llmInference.generateResponse(
  inputPrompt,
  loraModelRank4,
  (partialResult, done) => {
        document.getElementById('output').textContent += partialResult;
});