Vertex AI-তে Gemini-কে আরও সুন্দর করে তুলুন

১. ভূমিকা

এই ল্যাবে, আপনি একটি নির্দিষ্ট কাজের জন্য—যেমন আর্টিকেলের সারসংক্ষেপ তৈরি—একটি গুগল জেমিনি মডেলকে অভিযোজিত করতে সুপারভাইজড ফাইন-টিউনিং-এর সম্পূর্ণ কার্যপ্রবাহ সম্পাদন করতে শিখবেন। যদিও বৃহৎ ল্যাঙ্গুয়েজ মডেলগুলো শক্তিশালী, এদের সাধারণ-উদ্দেশ্যমূলক প্রকৃতির কারণে ফাইন-টিউনিং-এর মাধ্যমে নির্দিষ্ট ব্যবহারের জন্য সেগুলোকে আরও বেশি কার্যকর করে তোলা যায়। উদাহরণের একটি উচ্চ-মানের ডেটাসেটে মডেলটিকে প্রশিক্ষণ দিয়ে, আপনি আপনার নির্দিষ্ট কাজের জন্য এর সামঞ্জস্য, গুণমান এবং কার্যকারিতা উন্নত করতে পারেন।

আপনি জেমিনি ২.৫ ফ্ল্যাশ (Gemini 2.5 Flash) নামক একটি হালকা ও সাশ্রয়ী মডেল ব্যবহার করবেন এবং ভার্টেক্স এআই (Vertex AI) দিয়ে সূক্ষ্ম সমন্বয় সাধন করবেন।

স্থাপত্যের সংক্ষিপ্ত বিবরণ

আমরা যা তৈরি করব তা হলো:

  • ক্লাউড শেল : আপনার উন্নয়ন পরিবেশ।
  • ক্লাউড স্টোরেজ : প্রশিক্ষণ/যাচাই ডেটা JSONL ফরম্যাটে সংরক্ষণ করে।
  • ভার্টেক্স এআই ট্রেনিং : সূক্ষ্ম সমন্বয়ের কাজটি পরিচালনা করে।
  • ভার্টেক্স এআই এন্ডপয়েন্ট : আপনার সূক্ষ্মভাবে টিউন করা মডেলটি হোস্ট করে।

আপনি যা শিখবেন

  • সুপারভাইজড ফাইন-টিউনিংয়ের জন্য উচ্চ মানের ডেটাসেট প্রস্তুত করুন।
  • পাইথনের জন্য ভার্টেক্স এআই এসডিকে ব্যবহার করে ফাইন-টিউনিং জবগুলো কনফিগার ও চালু করুন।
  • স্বয়ংক্রিয় মেট্রিক (ROUGE স্কোর) ব্যবহার করে মডেল মূল্যায়ন করুন।
  • উন্নতির পরিমাণ নির্ণয় করতে মূল মডেল এবং পরিমার্জিত মডেলের তুলনা করুন।

২. প্রজেক্ট সেটআপ

গুগল অ্যাকাউন্ট

যদি আপনার আগে থেকে কোনো ব্যক্তিগত গুগল অ্যাকাউন্ট না থাকে, তাহলে আপনাকে অবশ্যই একটি গুগল অ্যাকাউন্ট তৈরি করতে হবে।

কর্মক্ষেত্র বা শিক্ষা প্রতিষ্ঠানের অ্যাকাউন্টের পরিবর্তে ব্যক্তিগত অ্যাকাউন্ট ব্যবহার করুন

গুগল ক্লাউড কনসোলে সাইন-ইন করুন

আপনার ব্যক্তিগত গুগল অ্যাকাউন্ট ব্যবহার করে গুগল ক্লাউড কনসোলে সাইন-ইন করুন।

বিলিং সক্ষম করুন

$5 গুগল ক্লাউড ক্রেডিট রিডিম করুন (ঐচ্ছিক)

এই কর্মশালাটি চালানোর জন্য আপনার একটি বিলিং অ্যাকাউন্ট প্রয়োজন, যাতে কিছু ব্যালেন্স আছে। আপনি যদি আপনার নিজস্ব বিলিং ব্যবহার করার পরিকল্পনা করেন, তবে এই ধাপটি বাদ দিতে পারেন।

  1. এই লিঙ্কে ক্লিক করুন এবং আপনার ব্যক্তিগত গুগল অ্যাকাউন্ট দিয়ে সাইন ইন করুন। আপনি এইরকম কিছু দেখতে পাবেন: ক্লাউড শেল অনুমোদন করতে ক্লিক করুন
  2. "আপনার ক্রেডিট অ্যাক্সেস করতে এখানে ক্লিক করুন" বোতামটিতে ক্লিক করুন। এটি আপনাকে আপনার বিলিং প্রোফাইল সেট আপ করার পৃষ্ঠায় নিয়ে যাবে। ক্লাউড শেল অনুমোদন করতে ক্লিক করুন
  3. নিশ্চিত করতে ক্লিক করুন

আপনি এখন একটি গুগল ক্লাউড প্ল্যাটফর্ম ট্রায়াল বিলিং অ্যাকাউন্টের সাথে সংযুক্ত হয়েছেন।

বিলিং ওভারভিউয়ের স্ক্রিনশট

একটি প্রকল্প তৈরি করুন (ঐচ্ছিক)

এই ল্যাবের জন্য ব্যবহার করার মতো আপনার যদি কোনো চলমান প্রজেক্ট না থাকে, তাহলে এখানে একটি নতুন প্রজেক্ট তৈরি করুন

৩. ক্লাউড শেল এডিটর খুলুন

  1. সরাসরি ক্লাউড শেল এডিটর- এ যেতে এই লিঙ্কে ক্লিক করুন।
  2. আজ যেকোনো সময়ে অনুমোদনের জন্য অনুরোধ করা হলে, চালিয়ে যাওয়ার জন্য 'অনুমোদন করুন' (Authorize) বোতামে ক্লিক করুন। ক্লাউড শেল অনুমোদন করতে ক্লিক করুন
  3. যদি স্ক্রিনের নীচে টার্মিনালটি দেখা না যায়, তাহলে এটি খুলুন:
    • ভিউ ক্লিক করুন
    • টার্মিনালে ক্লিক করুন ক্লাউড শেল এডিটরে নতুন টার্মিনাল খুলুন
  4. টার্মিনালে এই কমান্ডটি দিয়ে আপনার প্রজেক্ট সেট করুন:
    gcloud config set project [PROJECT_ID]
    
    • উদাহরণ:
      gcloud config set project lab-project-id-example
      
    • আপনি যদি আপনার প্রজেক্ট আইডি মনে রাখতে না পারেন, তাহলে নিম্নলিখিত উপায়ে আপনার সমস্ত প্রজেক্ট আইডি তালিকাভুক্ত করতে পারেন:
      gcloud projects list
      
      ক্লাউড শেল এডিটর টার্মিনালে প্রজেক্ট আইডি সেট করুন
  5. আপনার এই বার্তাটি দেখা উচিত:
    Updated property [core/project].
    

৪. এপিআই সক্রিয় করুন

Vertex AI এবং অন্যান্য পরিষেবা ব্যবহার করার জন্য, আপনাকে আপনার Google Cloud প্রজেক্টে প্রয়োজনীয় API-গুলো সক্রিয় করতে হবে।

  1. টার্মিনালে, এপিআইগুলো সক্রিয় করুন:
    • ভার্টেক্স এআই এপিআই ( aiplatform.googleapis.com ): মডেল ফাইন-টিউনিং এবং পরিবেশনের জন্য ভার্টেক্স এআই ব্যবহারের সুযোগ দেয়।
    • ক্লাউড স্টোরেজ এপিআই ( storage.googleapis.com ): ডেটাসেট এবং মডেল আর্টিফ্যাক্ট সংরক্ষণে সক্ষম করে।
    gcloud services enable aiplatform.googleapis.com \
        storage.googleapis.com
    

৫. প্রকল্পের পরিবেশ তৈরি করুন

একটি ওয়ার্কিং ডিরেক্টরি তৈরি করুন

  1. টার্মিনালে আপনার প্রোজেক্টের জন্য একটি ডিরেক্টরি তৈরি করুন এবং সেটির ভেতরে প্রবেশ করুন।
    mkdir gemini-finetuning
    cd gemini-finetuning
    

পরিবেশ ভেরিয়েবল সেট আপ করুন

  1. টার্মিনালে আপনার প্রোজেক্টের জন্য এনভায়রনমেন্ট ভেরিয়েবলগুলো নির্ধারণ করুন। আমরা এই ভেরিয়েবলগুলো সংরক্ষণের জন্য একটি env.sh ফাইল তৈরি করব, যাতে আপনার সেশন সংযোগ বিচ্ছিন্ন হয়ে গেলেও সেগুলো সহজেই পুনরায় লোড করা যায়।
    cat <<EOF > env.sh
    export PROJECT_ID=\$(gcloud config get-value project)
    export REGION="us-central1"
    export BUCKET_NAME="\${PROJECT_ID}-gemini-tuning"
    EOF
    
    source env.sh
    

একটি ক্লাউড স্টোরেজ বাকেট তৈরি করুন

  1. টার্মিনালে আপনার ডেটাসেট এবং মডেল আর্টিফ্যাক্টগুলো সংরক্ষণের জন্য একটি বাকেট তৈরি করুন।
    gcloud storage buckets create gs://$BUCKET_NAME --project=$PROJECT_ID --location=$REGION
    

ভার্চুয়াল পরিবেশ সেট আপ করুন

  1. আমরা আমাদের পাইথন এনভায়রনমেন্ট পরিচালনা করতে uv ব্যবহার করব। টার্মিনালে , রান করুন:
    uv venv .venv
    source .venv/bin/activate
    
  2. টার্মিনালে প্রয়োজনীয় পাইথন প্যাকেজগুলো ইনস্টল করুন।
    uv pip install google-cloud-aiplatform rouge-score matplotlib pandas tqdm
    

৬. প্রশিক্ষণ ডেটা প্রস্তুত করুন।

উন্নত মানের ডেটাই সফল ফাইন-টিউনিংয়ের ভিত্তি। আপনি WikiLingua ডেটাসেটটি ব্যবহার করে, সেটিকে Gemini-র প্রয়োজনীয় নির্দিষ্ট JSONL ফরম্যাটে রূপান্তর করবেন এবং আপনার স্টোরেজ বাকেটে আপলোড করবেন।

  1. টার্মিনালে prepare_data.py নামে একটি ফাইল তৈরি করুন।
    cloudshell edit prepare_data.py
    
  2. নিম্নলিখিত কোডটি prepare_data.py ফাইলে পেস্ট করুন।
    import json
    import os
    import pandas as pd
    from google.cloud import storage
    import subprocess
    
    # Configuration
    BUCKET_NAME = os.environ["BUCKET_NAME"]
    PROJECT_ID = os.environ["PROJECT_ID"]
    
    def download_data():
        print("Downloading WikiLingua dataset...")
        # Using gsutil to copy from public bucket
        subprocess.run(["gsutil", "cp", "gs://github-repo/generative-ai/gemini/tuning/summarization/wikilingua/*", "."], check=True)
    
    def convert_to_gemini_format(input_file, output_file, max_samples=1000):
        print(f"Converting {input_file} to Gemini format (first {max_samples} samples)...")
        converted_data = []
        with open(input_file, 'r') as f:
            for i, line in enumerate(f):
                if i >= max_samples:
                    break
                obj = json.loads(line)
                messages = obj.get("messages", [])
    
                # Convert messages to Gemini 2.5 format
                # Input: {"messages": [{"role": "user", "content": "..."}, {"role": "model", "content": "..."}]}
                # Output: {"contents": [{"role": "user", "parts": [{"text": "..."}]}, {"role": "model", "parts": [{"text": "..."}]}]}
    
                contents = []
                for msg in messages:
                    role = msg["role"]
                    content = msg["content"]
                    contents.append({
                        "role": role,
                        "parts": [{"text": content}]
                    })
    
                converted_data.append({"contents": contents})
    
        with open(output_file, 'w') as f:
            for item in converted_data:
                f.write(json.dumps(item) + "\n")
    
        print(f"Saved {len(converted_data)} examples to {output_file}")
    
    def upload_to_gcs(local_file, destination_blob_name):
        print(f"Uploading {local_file} to gs://{BUCKET_NAME}/{destination_blob_name}...")
        storage_client = storage.Client(project=PROJECT_ID)
        bucket = storage_client.bucket(BUCKET_NAME)
        blob = bucket.blob(destination_blob_name)
        blob.upload_from_filename(local_file)
        print("Upload complete.")
    
    def main():
        download_data()
    
        # Process Training Data
        convert_to_gemini_format("sft_train_samples.jsonl", "train_gemini.jsonl")
        upload_to_gcs("train_gemini.jsonl", "datasets/train/train_gemini.jsonl")
    
        # Process Validation Data
        convert_to_gemini_format("sft_val_samples.jsonl", "val_gemini.jsonl")
        upload_to_gcs("val_gemini.jsonl", "datasets/val/val_gemini.jsonl")
    
        print("Data preparation complete!")
    
    if __name__ == "__main__":
        main()
    
  3. টার্মিনালে ডেটা প্রস্তুতি স্ক্রিপ্টটি চালান।
    python prepare_data.py
    

৭. ভিত্তি কর্মক্ষমতা স্থাপন করুন

সূক্ষ্ম সমন্বয়ের আগে, আপনার একটি বেঞ্চমার্ক প্রয়োজন। ROUGE স্কোর ব্যবহার করে আপনি পরিমাপ করবেন যে, সারসংক্ষেপ তৈরির কাজে বেস gemini-2.5-flash মডেলটি কতটা ভালো কাজ করে।

  1. টার্মিনালে evaluate.py নামে একটি ফাইল তৈরি করুন।
    cloudshell edit evaluate.py
    
  2. নিম্নলিখিত কোডটি evaluate.py ফাইলে পেস্ট করুন।
    import argparse
    import json
    import os
    import pandas as pd
    from google.cloud import aiplatform
    import vertexai
    from vertexai.generative_models import GenerativeModel, GenerationConfig, HarmCategory, HarmBlockThreshold
    from rouge_score import rouge_scorer
    from tqdm import tqdm
    import matplotlib.pyplot as plt
    import time
    
    # Configuration
    PROJECT_ID = os.environ["PROJECT_ID"]
    REGION = os.environ["REGION"]
    
    aiplatform.init(project=PROJECT_ID, location=REGION)
    
    def evaluate(model_name, test_file, max_samples=50, output_json="results.json"):
        print(f"Evaluating model: {model_name}")
    
        # Load Test Data
        test_df = pd.read_csv(test_file)
        test_df = test_df.head(max_samples)
    
        model = GenerativeModel(model_name)
    
        safety_settings = {
            HarmCategory.HARM_CATEGORY_HARASSMENT: HarmBlockThreshold.BLOCK_ONLY_HIGH,
            HarmCategory.HARM_CATEGORY_HATE_SPEECH: HarmBlockThreshold.BLOCK_ONLY_HIGH,
            HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_ONLY_HIGH,
            HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_ONLY_HIGH,
        }
    
        generation_config = GenerationConfig(
            temperature=0.1,
            max_output_tokens=1024,
        )
    
        scorer = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rougeL'], use_stemmer=True)
        results = []
    
        for index, row in tqdm(test_df.iterrows(), total=len(test_df)):
            input_text = row['input_text']
            reference_summary = row['output_text']
    
            try:
                response = model.generate_content(
                    input_text,
                    generation_config=generation_config,
                    safety_settings=safety_settings
                )
                generated_summary = response.text
    
                scores = scorer.score(reference_summary, generated_summary)
    
                results.append({
                    "generated": generated_summary,
                    "reference": reference_summary,
                    "rouge1": scores['rouge1'].fmeasure,
                    "rouge2": scores['rouge2'].fmeasure,
                    "rougeL": scores['rougeL'].fmeasure
                })
            except Exception as e:
                print(f"Error processing example {index}: {e}")
                # Sleep briefly to avoid quota issues if hitting limits
                time.sleep(1)
    
        # Save results
        with open(output_json, 'w') as f:
            json.dump(results, f, indent=2)
    
        return pd.DataFrame(results)
    
    def plot_results(df, title, filename):
        os.makedirs("plots", exist_ok=True)
    
        metrics = ['rouge1', 'rouge2', 'rougeL']
        fig, axes = plt.subplots(1, 3, figsize=(15, 5))
    
        for i, metric in enumerate(metrics):
            axes[i].hist(df[metric], bins=10, alpha=0.7, color='skyblue', edgecolor='black')
            axes[i].set_title(f'{metric} Distribution')
            axes[i].set_xlabel('Score')
            axes[i].set_ylabel('Count')
    
        plt.suptitle(title)
        plt.tight_layout()
        plt.savefig(f"plots/{filename}")
        print(f"Plot saved to plots/{filename}")
    
    def compare_results(baseline_file, tuned_file):
        with open(baseline_file, 'r') as f:
            baseline_data = pd.DataFrame(json.load(f))
        with open(tuned_file, 'r') as f:
            tuned_data = pd.DataFrame(json.load(f))
    
        print("\n--- Comparison ---")
        metrics = ['rouge1', 'rouge2', 'rougeL']
        for metric in metrics:
            base_mean = baseline_data[metric].mean()
            tuned_mean = tuned_data[metric].mean()
            diff = tuned_mean - base_mean
            print(f"{metric}: Base={base_mean:.4f}, Tuned={tuned_mean:.4f}, Diff={diff:+.4f}")
    
        # Comparative Plot
        os.makedirs("plots", exist_ok=True)
        comparison_df = pd.DataFrame({
            'Metric': metrics,
            'Baseline': [baseline_data[m].mean() for m in metrics],
            'Tuned': [tuned_data[m].mean() for m in metrics]
        })
    
        comparison_df.plot(x='Metric', y=['Baseline', 'Tuned'], kind='bar', figsize=(10, 6))
        plt.title('Baseline vs Tuned Model Performance')
        plt.ylabel('Average Score')
        plt.xticks(rotation=0)
        plt.tight_layout()
        plt.savefig("plots/comparison.png")
        print("Comparison plot saved to plots/comparison.png")
    
    def main():
        parser = argparse.ArgumentParser()
        parser.add_argument("--model", type=str, default="gemini-2.5-flash", help="Model resource name")
        parser.add_argument("--baseline", type=str, help="Path to baseline results json for comparison")
        parser.add_argument("--output", type=str, default="results.json", help="Output file for results")
        args = parser.parse_args()
    
        # Ensure test data exists (it was downloaded in prepare_data step)
        if not os.path.exists("sft_test_samples.csv"):
            # Fallback download if needed
            subprocess.run(["gsutil", "cp", "gs://github-repo/generative-ai/gemini/tuning/summarization/wikilingua/sft_test_samples.csv", "."], check=True)
    
        df = evaluate(args.model, "sft_test_samples.csv", output_json=args.output)
    
        print("\n--- Results Summary ---")
        print(df.describe())
    
        plot_filename = "baseline_dist.png" if not args.baseline else "tuned_dist.png"
        plot_results(df, f"ROUGE Scores - {args.model}", plot_filename)
    
        if args.baseline:
            compare_results(args.baseline, args.output)
    
    if __name__ == "__main__":
        main()
    
  3. টার্মিনালে বেসলাইন মূল্যায়নটি চালান।
    python evaluate.py --model "gemini-2.5-flash" --output "baseline.json"
    
    এটি একটি baseline.json ফাইল এবং plots/baseline_dist.png একটি প্লট তৈরি করবে।

৮. ফাইন-টিউনিং কনফিগার এবং চালু করুন

এখন আপনি ভার্টেক্স এআই-তে একটি পরিচালিত ফাইন-টিউনিং জব চালু করবেন।

  1. টার্মিনালে tune.py নামে একটি ফাইল তৈরি করুন।
    cloudshell edit tune.py
    
  2. নিচের কোডটি tune.py ফাইলে পেস্ট করুন।
    import os
    import time
    from google.cloud import aiplatform
    import vertexai
    from vertexai.preview.tuning import sft
    
    # Configuration
    PROJECT_ID = os.environ["PROJECT_ID"]
    REGION = os.environ["REGION"]
    BUCKET_NAME = os.environ["BUCKET_NAME"]
    
    aiplatform.init(project=PROJECT_ID, location=REGION)
    
    def train():
        print("Launching fine-tuning job...")
    
        sft_tuning_job = sft.train(
            source_model="gemini-2.5-flash", # Using specific version for stability
            train_dataset=f"gs://{BUCKET_NAME}/datasets/train/train_gemini.jsonl",
            validation_dataset=f"gs://{BUCKET_NAME}/datasets/val/val_gemini.jsonl",
            epochs=1, # Keep it short for the lab
            adapter_size=4,
            learning_rate_multiplier=1.0,
            tuned_model_display_name="gemini-2.5-flash-wikilingua",
        )
    
        print(f"Job started: {sft_tuning_job.resource_name}")
        print("Waiting for job to complete... (this may take ~45 minutes)")
    
        # Wait for the job to complete
        while not sft_tuning_job.has_ended:
            time.sleep(60)
            sft_tuning_job.refresh()
            print(f"Status: {sft_tuning_job.state.name}")
    
        print("Job completed!")
        print(f"Tuned Model Endpoint: {sft_tuning_job.tuned_model_endpoint_name}")
        return sft_tuning_job.tuned_model_endpoint_name
    
    if __name__ == "__main__":
        train()
    
  3. টার্মিনালে ফাইন-টিউনিং স্ক্রিপ্টটি চালান।
    python tune.py
    
    দ্রষ্টব্য : এই প্রক্রিয়াটিতে প্রায় ৪৫ মিনিট সময় লাগতে পারে। আপনি ভার্টেক্স এআই কনসোলে কাজটি পর্যবেক্ষণ করতে পারেন।

৯. প্রশিক্ষণ কোডটি বুঝুন।

আপনার কাজটি চলার সময়ে, ফাইন-টিউনিং কীভাবে কাজ করে তা বোঝার জন্য চলুন tune.py স্ক্রিপ্টটি আরও ভালোভাবে দেখে নেওয়া যাক।

পরিচালিত তত্ত্বাবধানকৃত সূক্ষ্ম সমন্বয়

স্ক্রিপ্টটি একটি পরিচালিত টিউনিং জব জমা দেওয়ার জন্য vertexai.tuning.sft.train পদ্ধতিটি ব্যবহার করে। এটি পরিকাঠামোর ব্যবস্থা করা, প্রশিক্ষণ বিতরণ করা এবং চেকপয়েন্ট পরিচালনা করার জটিলতা দূর করে।

sft_tuning_job = sft.train(
    source_model="gemini-2.5-flash",
    train_dataset=f"gs://{BUCKET_NAME}/datasets/train/train_gemini.jsonl",
    # ...
)

LoRA কনফিগারেশন

ওপেন-সোর্স ফ্রেমওয়ার্কের মতো ম্যানুয়ালি LoraConfig নির্ধারণ করার পরিবর্তে, Vertex AI এই প্রক্রিয়াটিকে কয়েকটি মূল প্যারামিটারে সরল করে তোলে:

  • adapter_size : এই প্যারামিটারটি (আমাদের স্ক্রিপ্টে 4 এ সেট করা) LoRA অ্যাডাপ্টারগুলোর র‍্যাঙ্ক নিয়ন্ত্রণ করে। এর আকার বড় হলে মডেলটি আরও জটিল অভিযোজন শিখতে পারে, কিন্তু এর ফলে প্রশিক্ষণযোগ্য প্যারামিটারের সংখ্যা বেড়ে যায়।
  • epochs : এই ল্যাবে প্রশিক্ষণের সময় কম (~২০ মিনিট) রাখার জন্য আমরা এটি 1 এ সেট করেছি। প্রোডাকশনের ক্ষেত্রে, মডেলকে আপনার ডেটা থেকে আরও গভীরভাবে শেখার সুযোগ দিতে আপনি এটি বাড়াতে পারেন, তবে ওভারফিটিং-এর ব্যাপারে সতর্ক থাকতে হবে।

মডেল নির্বাচন

আমরা স্পষ্টভাবে source_model="gemini-2.5-flash" নির্দিষ্ট করে দিই। Vertex AI, Gemini-এর বিভিন্ন সংস্করণ সমর্থন করে, এবং একটি নির্দিষ্ট সংস্করণ পিন করে রাখলে আপনার পাইপলাইন স্থিতিশীল ও পুনরুৎপাদনযোগ্য থাকে।

১০. মডেলগুলোর তুলনা করুন

সূক্ষ্ম সমন্বয়ের কাজটি সম্পন্ন হয়ে গেলে, আপনি আপনার নতুন মডেলের পারফরম্যান্সকে বেসলাইনের সাথে তুলনা করতে পারবেন।

  1. আপনার টিউন করা মডেলের এন্ডপয়েন্টটি নিন। এটি tune.py স্ক্রিপ্টের শেষে প্রিন্ট করা হয়েছিল। এটি দেখতে অনেকটা projects/.../locations/.../endpoints/... এর মতো হবে।
  2. এবার তুলনার জন্য আপনার টিউন করা মডেল এবং বেসলাইন ফলাফলগুলো পাস করে ইভ্যালুয়েশন স্ক্রিপ্টটি আবার চালান।
    # Replace [YOUR_TUNED_MODEL_ENDPOINT] with the actual endpoint name
    export TUNED_MODEL="projects/[YOUR_PROJECT_ID]/locations/[YOUR_REGION]/endpoints/[YOUR_ENDPOINT_ID]"
    
    python evaluate.py --model "$TUNED_MODEL" --baseline "baseline.json" --output "tuned.json"
    
  3. ফলাফল দেখুন। স্ক্রিপ্টটি ROUGE স্কোরের একটি তুলনামূলক চিত্র আউটপুট করবে এবং উন্নতি দেখানোর জন্য plots/comparison.png নামে একটি চার্ট তৈরি করবে। আপনি ক্লাউড শেল এডিটরে plots ফোল্ডারটি খুলে প্লটগুলো দেখতে পারেন।

১১. পরিষ্কার করুন

চার্জ এড়ানোর জন্য, আপনার তৈরি করা রিসোর্সগুলো মুছে ফেলুন।

  1. টার্মিনালে ক্লাউড স্টোরেজ বাকেট এবং টিউন করা মডেলটি ডিলিট করুন।
    gcloud storage rm -r gs://$BUCKET_NAME
    # Note: You can delete the model endpoint from the Vertex AI Console
    

১২. অভিনন্দন!

আপনি Vertex AI-তে Gemini 2.5 Flash সফলভাবে ফাইন-টিউন করেছেন!

পুনরালোচনা

এই ল্যাবে, আপনি:

  • জেমিনি ফাইন-টিউনিংয়ের জন্য JSONL ফরম্যাটে একটি ডেটাসেট প্রস্তুত করা হয়েছে।
  • বেস জেমিনি ২.৫ ফ্ল্যাশ মডেল ব্যবহার করে একটি বেসলাইন স্থাপন করা হয়েছে।
  • Vertex AI-তে একটি সুপারভাইজড ফাইন-টিউনিং জব চালু করা হয়েছে।
  • সূক্ষ্মভাবে সমন্বয় করা মডেলটিকে বেসলাইনের সাথে মূল্যায়ন ও তুলনা করা হয়েছে।

এরপর কী?

এই ল্যাবটি ‘প্রোডাকশন-রেডি এআই উইথ গুগল ক্লাউড’ লার্নিং পাথের একটি অংশ।

প্রোটোটাইপ থেকে উৎপাদনে উত্তরণের ব্যবধান পূরণ করতে সম্পূর্ণ পাঠ্যক্রমটি অন্বেষণ করুন।

#ProductionReadyAI হ্যাশট্যাগটি ব্যবহার করে আপনার অগ্রগতি শেয়ার করুন।