|
|
Google Colab-এ রান করান
|
|
|
GitHub-এ সোর্স দেখুন
|
মডেলের সাধারণ-উদ্দেশ্যমূলক জ্ঞান এবং আপনার অ্যাপ্লিকেশনের প্রয়োজনীয় বিশেষ, হাই-পারফর্ম্যান্স নির্ভুলতার মধ্যে পার্থক্য কমাতে ফাইন-টিউনিং সাহায্য করে। যেহেতু কোনও একটি মডেল সব কাজের জন্য উপযুক্ত নয়, তাই ফাইন-টিউনিং এটিকে আপনার নির্দিষ্ট ডোমেনের সাথে মানিয়ে নেয়।
ধরে নিন, আপনার কোম্পানি "Shibuya Financial" বিভিন্ন ধরনের জটিল আর্থিক প্রোডাক্ট অফার করে, যেমন ইনভেস্টমেন্ট ট্রাস্ট, NISA অ্যাকাউন্ট (ট্যাক্স-অ্যাডভান্টেজ সেভিংস অ্যাকাউন্ট) এবং হোম লোন। গ্রাহকের প্রশ্নের উত্তর দ্রুত খুঁজে পেতে, আপনার গ্রাহক সহায়তা টিম ইন্টার্নাল নলেজ বেস ব্যবহার করে।
সেট-আপ করুন
এই টিউটোরিয়াল শুরু করার আগে, নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:
- Hugging Face-এ লগ-ইন করে এবং Gemma মডেলের জন্য লাইসেন্স স্বীকার করুন বিকল্প বেছে নিয়ে EmbeddingGemma-তে অ্যাক্সেস পান।
- Hugging Face অ্যাক্সেস টোকেন তৈরি করুন এবং Colab থেকে লগ-ইন করার জন্য এটি ব্যবহার করুন।
এই নোটবুক CPU বা GPU-তে চলবে।
Python প্যাকেজ ইনস্টল করা
EmbeddingGemma মডেল চালানোর জন্য প্রয়োজনীয় লাইব্রেরি ইনস্টল করুন এবং এম্বেডিং তৈরি করুন। Sentence Transformers হল টেক্সট ও ইমেজ এম্বেডিংয়ের জন্য Python ফ্রেমওয়ার্ক। আরও তথ্যের জন্য, Sentence Transformers ডকুমেন্টেশন দেখুন।
pip install -U sentence-transformers git+https://github.com/huggingface/transformers@v4.56.0-Embedding-Gemma-previewলাইসেন্সে সম্মতি জানানোর পরে, মডেল অ্যাক্সেস করার জন্য আপনার একটি বৈধ Hugging Face টোকেন প্রয়োজন।
# Login into Hugging Face Hub
from huggingface_hub import login
login()
মডেল লোড করা
EmbeddingGemma-র সাহায্যে মডেল ক্লাসের ইনস্ট্যান্স তৈরি করতে sentence-transformers লাইব্রেরি ব্যবহার করুন।
import torch
from sentence_transformers import SentenceTransformer
device = "cuda" if torch.cuda.is_available() else "cpu"
model_id = "google/embeddinggemma-300M"
model = SentenceTransformer(model_id).to(device=device)
print(f"Device: {model.device}")
print(model)
print("Total number of parameters in the model:", sum([p.numel() for _, p in model.named_parameters()]))
Device: cuda:0
SentenceTransformer(
(0): Transformer({'max_seq_length': 2048, 'do_lower_case': False, 'architecture': 'Gemma3TextModel'})
(1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False, 'include_prompt': True})
(2): Dense({'in_features': 768, 'out_features': 3072, 'bias': False, 'activation_function': 'torch.nn.modules.linear.Identity'})
(3): Dense({'in_features': 3072, 'out_features': 768, 'bias': False, 'activation_function': 'torch.nn.modules.linear.Identity'})
(4): Normalize()
)
Total number of parameters in the model: 307581696
ফাইন-টিউনিং ডেটাসেট প্রস্তুত করা
এটি সবচেয়ে গুরুত্বপূর্ণ অংশ। আপনাকে এমন একটি ডেটাসেট তৈরি করতে হবে যা আপনার নির্দিষ্ট প্রসঙ্গে "একই ধরনের" বলতে কী বোঝায় তা মডেলকে শেখায়। এই ডেটা প্রায়ই ট্রিপলেট হিসেবে স্ট্রাকচার করা হয়: (অ্যাঙ্কর, পজিটিভ, নেগেটিভ)
- অ্যাঙ্কর: আসল কোয়েরি বা বাক্য।
- ইতিবাচক: এমন বাক্য যা অ্যাঙ্করের সাথে অর্থগতভাবে খুব মিল বা হুবহু একই।
- নেগেটিভ: এমন বাক্য যা সম্পর্কিত বিষয়ের উপর ভিত্তি করে লেখা কিন্তু সেম্যান্টিক দিক থেকে আলাদা।
এই উদাহরণে, আমরা শুধুমাত্র ৩টি ট্রিপলেট তৈরি করেছি, কিন্তু একটি বাস্তব অ্যাপ্লিকেশনের জন্য, ভাল পারফর্ম করার জন্য আপনার অনেক বড় ডেটাসেট প্রয়োজন হবে।
from datasets import Dataset
dataset = [
["How do I open a NISA account?", "What is the procedure for starting a new tax-free investment account?", "I want to check the balance of my regular savings account."],
["Are there fees for making an early repayment on a home loan?", "If I pay back my house loan early, will there be any costs?", "What is the management fee for this investment trust?"],
["What is the coverage for medical insurance?", "Tell me about the benefits of the health insurance plan.", "What is the cancellation policy for my life insurance?"],
]
# Convert the list-based dataset into a list of dictionaries.
data_as_dicts = [ {"anchor": row[0], "positive": row[1], "negative": row[2]} for row in dataset ]
# Create a Hugging Face `Dataset` object from the list of dictionaries.
train_dataset = Dataset.from_list(data_as_dicts)
print(train_dataset)
Dataset({
features: ['anchor', 'positive', 'negative'],
num_rows: 3
})
ফাইন-টিউনিংয়ের আগে
"ট্যাক্স-ফ্রি বিনিয়োগ" সার্চ করলে, সাদৃশ্যের স্কোর সহ নিম্নলিখিত ফলাফল পাওয়া যেতে পারে:
- ডকুমেন্ট: NISA অ্যাকাউন্ট খোলা (স্কোর: ০.৫১)
- ডকুমেন্ট: সাধারণ সেভিংস অ্যাকাউন্ট খোলা (স্কোর: ০.৫০) <- একই ধরনের স্কোর, বিভ্রান্তিকর হতে পারে
- ডকুমেন্ট: হোম লোন আবেদন গাইড (স্কোর: ০.৪৪)
task_name = "STS"
def get_scores(query, documents):
# Calculate embeddings by calling model.encode()
query_embeddings = model.encode(query, prompt_name=task_name)
doc_embeddings = model.encode(documents, prompt_name=task_name)
# Calculate the embedding similarities
similarities = model.similarity(query_embeddings, doc_embeddings)
for idx, doc in enumerate(documents):
print("Document: ", doc, "-> 🤖 Score: ", similarities.numpy()[0][idx])
query = "I want to start a tax-free installment investment, what should I do?"
documents = ["Opening a NISA Account", "Opening a Regular Savings Account", "Home Loan Application Guide"]
get_scores(query, documents)
Document: Opening a NISA Account -> 🤖 Score: 0.51571906 Document: Opening a Regular Savings Account -> 🤖 Score: 0.5035889 Document: Home Loan Application Guide -> 🤖 Score: 0.4406476
ট্রেনিং
Python-এ sentence-transformers-এর মতো ফ্রেমওয়ার্ক ব্যবহার করে, বেস মডেল ধীরে ধীরে আপনার আর্থিক শব্দভান্ডারের সূক্ষ্ম পার্থক্যগুলি শিখে নেয়।
from sentence_transformers import SentenceTransformerTrainer, SentenceTransformerTrainingArguments
from sentence_transformers.losses import MultipleNegativesRankingLoss
from transformers import TrainerCallback
loss = MultipleNegativesRankingLoss(model)
args = SentenceTransformerTrainingArguments(
# Required parameter:
output_dir="my-embedding-gemma",
# Optional training parameters:
prompts=model.prompts[task_name], # use model's prompt to train
num_train_epochs=5,
per_device_train_batch_size=1,
learning_rate=2e-5,
warmup_ratio=0.1,
# Optional tracking/debugging parameters:
logging_steps=train_dataset.num_rows,
report_to="none",
)
class MyCallback(TrainerCallback):
"A callback that evaluates the model at the end of eopch"
def __init__(self, evaluate):
self.evaluate = evaluate # evaluate function
def on_log(self, args, state, control, **kwargs):
# Evaluate the model using text generation
print(f"Step {state.global_step} finished. Running evaluation:")
self.evaluate()
def evaluate():
get_scores(query, documents)
trainer = SentenceTransformerTrainer(
model=model,
args=args,
train_dataset=train_dataset,
loss=loss,
callbacks=[MyCallback(evaluate)]
)
trainer.train()
Step 3 finished. Running evaluation:
Document: Opening a NISA Account -> 🤖 Score: 0.6459116
Document: Opening a Regular Savings Account -> 🤖 Score: 0.42690125
Document: Home Loan Application Guide -> 🤖 Score: 0.40419024
Step 6 finished. Running evaluation:
Document: Opening a NISA Account -> 🤖 Score: 0.68530923
Document: Opening a Regular Savings Account -> 🤖 Score: 0.3611964
Document: Home Loan Application Guide -> 🤖 Score: 0.40812016
Step 9 finished. Running evaluation:
Document: Opening a NISA Account -> 🤖 Score: 0.7168733
Document: Opening a Regular Savings Account -> 🤖 Score: 0.3449782
Document: Home Loan Application Guide -> 🤖 Score: 0.44477722
Step 12 finished. Running evaluation:
Document: Opening a NISA Account -> 🤖 Score: 0.73008573
Document: Opening a Regular Savings Account -> 🤖 Score: 0.34124148
Document: Home Loan Application Guide -> 🤖 Score: 0.4676212
Step 15 finished. Running evaluation:
Document: Opening a NISA Account -> 🤖 Score: 0.73378766
Document: Opening a Regular Savings Account -> 🤖 Score: 0.34055778
Document: Home Loan Application Guide -> 🤖 Score: 0.47503752
Step 15 finished. Running evaluation:
Document: Opening a NISA Account -> 🤖 Score: 0.73378766
Document: Opening a Regular Savings Account -> 🤖 Score: 0.34055778
Document: Home Loan Application Guide -> 🤖 Score: 0.47503752
TrainOutput(global_step=15, training_loss=0.009651267528511198, metrics={'train_runtime': 195.3004, 'train_samples_per_second': 0.077, 'train_steps_per_second': 0.077, 'total_flos': 0.0, 'train_loss': 0.009651267528511198, 'epoch': 5.0})
ফাইন-টিউনিংয়ের পরে
একই সার্চের ক্ষেত্রে এখন অনেক বেশি স্পষ্ট ফলাফল পাওয়া যায়:
- ডকুমেন্ট: NISA অ্যাকাউন্ট খোলা (স্কোর: ০.৭৩) <- অনেক বেশি আত্মবিশ্বাসী
- ডকুমেন্ট: সাধারণ সেভিংস অ্যাকাউন্ট খোলা (স্কোর: ০.৩৪) <- স্পষ্টতই কম প্রাসঙ্গিক
- ডকুমেন্ট: হোম লোন আবেদন গাইড (স্কোর: ০.৪৭)
get_scores(query, documents)
Document: Opening a NISA Account -> 🤖 Score: 0.73378766 Document: Opening a Regular Savings Account -> 🤖 Score: 0.34055778 Document: Home Loan Application Guide -> 🤖 Score: 0.47503752
Hugging Face Hub-এ আপনার মডেল আপলোড করতে, আপনি Sentence Transformers লাইব্রেরি থেকে push_to_hub পদ্ধতি ব্যবহার করতে পারেন।
আপনার মডেল আপলোড করলে, Hub থেকে সরাসরি ইনফারেন্সের জন্য এটি অ্যাক্সেস করা, অন্যদের সাথে শেয়ার করা এবং আপনার কাজের ভার্সন তৈরি করা সহজ হয়ে যায়। আপলোড করা হয়ে গেলে, যেকোনও ব্যক্তি কোডের একটি লাইন ব্যবহার করে আপনার মডেল লোড করতে পারবেন, এর জন্য শুধু অনন্য মডেল আইডি <username>/my-embedding-gemma উল্লেখ করতে হবে
# Push to Hub
model.push_to_hub("my-embedding-gemma")
সারসংক্ষেপ ও পরবর্তী ধাপ
আপনি এখন শিখেছেন কীভাবে Sentence Transformers লাইব্রেরির মাধ্যমে ফাইন-টিউন করে কোনও নির্দিষ্ট ডোমেনের জন্য EmbeddingGemma মডেল অ্যাডাপ্ট করতে হয়।
EmbeddingGemma-র সাহায্যে আর কী কী করতে পারবেন তা এক্সপ্লোর করুন:
- Sentence Transformers ডকুমেন্টেশনে ট্রেনিং ওভারভিউ
- Sentence Transformers-এর মাধ্যমে এম্বেডিং জেনারেট করা
- Gemma Cookbook-এ RAG-এর সহজ উদাহরণ
Google Colab-এ রান করান
GitHub-এ সোর্স দেখুন