সার্ভারলেস এআই: ক্লাউড রানের সাথে জেমা এম্বেড করা

১. ভূমিকা

এই কোডল্যাবে, আপনি শিখবেন কীভাবে GPU ব্যবহার করে ক্লাউড রান -এ EmbeddingGemma নামক একটি শক্তিশালী বহুভাষিক টেক্সট এমবেডিং মডেল ডেপ্লয় করতে হয়। এরপর আপনি এই ডেপ্লয় করা সার্ভিসটি ব্যবহার করে একটি সিম্যান্টিক সার্চ অ্যাপ্লিকেশনের জন্য এমবেডিং তৈরি করবেন।

প্রচলিত লার্জ ল্যাঙ্গুয়েজ মডেল (এলএলএম) টেক্সট তৈরি করলেও, এমবেডিং মডেল টেক্সটকে নিউমেরিক্যাল ভেক্টরে রূপান্তরিত করে। এই ভেক্টরগুলো রিট্রিভাল-অগমেন্টেড জেনারেশন (RAG) সিস্টেম তৈরির জন্য অত্যন্ত গুরুত্বপূর্ণ, যা একজন ব্যবহারকারীর কোয়েরির জন্য সবচেয়ে প্রাসঙ্গিক ডকুমেন্টগুলো খুঁজে পেতে সাহায্য করে।

আপনি যা করবেন

  • Ollama ব্যবহার করে EmbeddingGemma মডেলটিকে কন্টেইনারাইজ করুন।
  • GPU অ্যাক্সিলারেশন সহ কন্টেইনারটি ক্লাউড রান- এ ডেপ্লয় করুন।
  • নমুনা টেক্সটের জন্য এমবেডিং তৈরি করে ডেপ্লয় করা মডেলটি পরীক্ষা করুন।
  • আপনার ডেপ্লয় করা সার্ভিসটি ব্যবহার করে একটি লাইটওয়েট সিমান্টিক সার্চ সিস্টেম তৈরি করুন।

আপনার যা যা লাগবে

  • বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট।
  • ডকার এবং কমান্ড লাইন সম্পর্কে প্রাথমিক ধারণা।

২. শুরু করার আগে

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

  1. যদি আপনার আগে থেকে কোনো গুগল অ্যাকাউন্ট না থাকে, তাহলে আপনাকে অবশ্যই একটি গুগল অ্যাকাউন্ট তৈরি করতে হবে।
    • কর্মক্ষেত্র বা শিক্ষা প্রতিষ্ঠানের অ্যাকাউন্টের পরিবর্তে ব্যক্তিগত অ্যাকাউন্ট ব্যবহার করুন। কর্মক্ষেত্র এবং শিক্ষা প্রতিষ্ঠানে এমন কিছু সীমাবদ্ধতা থাকতে পারে, যার ফলে আপনি এই ল্যাবের জন্য প্রয়োজনীয় এপিআই (API) সক্রিয় করতে পারবেন না।
  2. গুগল ক্লাউড কনসোলে সাইন-ইন করুন।
  3. ক্লাউড কনসোলে বিলিং চালু করুন
    • এই ল্যাবটি সম্পন্ন করতে ক্লাউড রিসোর্সে ১ মার্কিন ডলারেরও কম খরচ হওয়া উচিত।
    • পরবর্তী চার্জ এড়াতে, এই ল্যাবের শেষে দেওয়া ধাপগুলো অনুসরণ করে আপনি রিসোর্সগুলো মুছে ফেলতে পারেন।
    • নতুন ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়ালের জন্য যোগ্য।
  4. একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন।
    • প্রজেক্ট কোটা সংক্রান্ত কোনো ত্রুটি দেখলে, একটি নতুন প্রজেক্ট তৈরি করার জন্য বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন অথবা আগের প্রজেক্টটি মুছে ফেলুন।

ক্লাউড শেল শুরু করুন

ক্লাউড শেল হলো গুগল ক্লাউডে চালিত একটি কমান্ড-লাইন পরিবেশ, যা প্রয়োজনীয় টুলস সহ আগে থেকেই লোড করা থাকে।

  1. Google Cloud কনসোলের শীর্ষে থাকা Activate Cloud Shell-এ ক্লিক করুন।
  2. ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনার প্রমাণীকরণ যাচাই করুন:
    gcloud auth list
    
  3. আপনার প্রকল্পটি নির্বাচিত হয়েছে কিনা তা নিশ্চিত করুন:
    gcloud config get project
    
  4. প্রয়োজনে সেট করুন:
    gcloud config set project <YOUR_PROJECT_ID>
    

এপিআই সক্ষম করুন

প্রয়োজনীয় সকল API সক্রিয় করতে এই কমান্ডটি চালান:

gcloud services enable \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com

৩. মডেলটিকে কন্টেইনারাইজ করুন

EmbeddingGemma সার্ভারলেসভাবে চালানোর জন্য, আমাদের এটিকে একটি কন্টেইনারে প্যাকেজ করতে হবে। আমরা LLM চালানোর জন্য একটি লাইটওয়েট ফ্রেমওয়ার্ক Ollama এবং Docker ব্যবহার করব।

ডকারফাইল তৈরি করুন

ক্লাউড শেলে, আপনার প্রোজেক্টের জন্য একটি নতুন ডিরেক্টরি তৈরি করুন এবং সেটির ভেতরে যান:

mkdir embedding-gemma-codelab
cd embedding-gemma-codelab

নিম্নলিখিত বিষয়বস্তু সহ Dockerfile নামে একটি ফাইল তৈরি করুন:

FROM ollama/ollama:latest

# Listen on all interfaces, port 8080
ENV OLLAMA_HOST=0.0.0.0:8080

# Store model weight files in /models
ENV OLLAMA_MODELS=/models

# Reduce logging verbosity
ENV OLLAMA_DEBUG=false

# Never unload model weights from the GPU
ENV OLLAMA_KEEP_ALIVE=-1

# Store the model weights in the container image
ENV MODEL=embeddinggemma:latest
RUN ollama serve & sleep 5 && ollama pull $MODEL

# Start Ollama
ENTRYPOINT ["ollama", "serve"]

এই ডকারফাইলটি নিম্নলিখিত কাজগুলো করে:

  1. অফিসিয়াল ওলামা বেস ইমেজ থেকে শুরু হয়।
  2. Ollama-কে 8080 পোর্টে (Cloud Run-এর ডিফল্ট) শোনার জন্য কনফিগার করে।
  3. RUN কমান্ডটি ollama সার্ভার চালু করে এবং বিল্ড প্রক্রিয়ার সময় embeddinggemma মডেলটি ডাউনলোড করে, ফলে এটি ইমেজের সাথে অন্তর্ভুক্ত হয়ে যায়।
  4. পরবর্তী অনুরোধগুলো দ্রুততর করার জন্য মডেলটি যাতে GPU মেমরিতে লোড থাকে, তা নিশ্চিত করতে OLLAMA_KEEP_ALIVE=-1 সেট করা হয়।

৪. নির্মাণ ও স্থাপন

আমরা ক্লাউড রান সোর্স ডিপ্লয়মেন্ট ব্যবহার করে এক ধাপে আমাদের কন্টেইনারটি বিল্ড ও ডিপ্লয় করব। এই কমান্ডটি ক্লাউড বিল্ড ব্যবহার করে ইমেজটি বিল্ড করে, আর্টিফ্যাক্ট রেজিস্ট্রি-তে সংরক্ষণ করে এবং ক্লাউড রান-এ ডিপ্লয় করে।

ডিপ্লয় করতে নিম্নলিখিত কমান্ডটি চালান:

gcloud run deploy embedding-gemma \
  --source . \
  --region europe-west1 \
  --concurrency 4 \
  --cpu 8 \
  --set-env-vars OLLAMA_NUM_PARALLEL=4 \
  --gpu 1 \
  --gpu-type nvidia-l4 \
  --max-instances 1 \
  --memory 32Gi \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --no-gpu-zonal-redundancy \
  --timeout=600 \
  --labels dev-tutorial=codelab-embedding-gemma

কনফিগারেশন বোঝা

  • --source . বিল্ডের উৎস হিসেবে বর্তমান ডিরেক্টরিকে নির্দিষ্ট করে।
  • --region europe-west1 আমরা এমন একটি অঞ্চল ব্যবহার করি যা ক্লাউড রানে জিপিইউ সমর্থন করে।
  • --concurrency 4 OLLAMA_NUM_PARALLEL এনভায়রনমেন্ট ভেরিয়েবলের মানের সাথে মেলানোর জন্য সেট করা হয়েছে।
  • --gpu 1 এর সাথে --gpu-type nvidia-l4 বিকল্পটি সার্ভিসটির প্রতিটি Cloud Run ইনস্ট্যান্সে ১টি NVIDIA L4 GPU বরাদ্দ করে।
  • --max-instances 1 সর্বোচ্চ কতগুলো ইনস্ট্যান্স পর্যন্ত স্কেল করা হবে তা নির্দিষ্ট করে। এই সংখ্যাটি আপনার প্রোজেক্টের NVIDIA L4 GPU কোটার সমান বা তার চেয়ে কম হতে হবে।
  • --no-allow-unauthenticated সার্ভিসে প্রমাণীকরণবিহীন অ্যাক্সেস সীমাবদ্ধ করে। সার্ভিসটিকে ব্যক্তিগত রাখার মাধ্যমে, আপনি সার্ভিস-টু-সার্ভিস যোগাযোগের জন্য ক্লাউড রানের অন্তর্নির্মিত আইডেন্টিটি অ্যান্ড অ্যাক্সেস ম্যানেজমেন্ট (IAM) প্রমাণীকরণের উপর নির্ভর করতে পারেন।
  • GPU সক্রিয় করার জন্য --no-cpu-throttling আবশ্যক।
  • --no-gpu-zonal-redundancy আপনার জোনাল ফেইলওভারের প্রয়োজনীয়তা এবং উপলব্ধ কোটার উপর নির্ভর করে জোনাল রিডানডেন্সি অপশন সেট করে।

আঞ্চলিক বিবেচনা

ক্লাউড রান-এর জিপিইউগুলো নির্দিষ্ট কিছু অঞ্চলে উপলব্ধ। আপনি ডকুমেন্টেশন থেকে সমর্থিত অঞ্চলগুলো দেখে নিতে পারেন।

স্থাপন আউটপুট

কয়েক মিনিট পর, ডেপ্লয়মেন্ট সম্পন্ন হবে এবং আপনি এইরকম একটি বার্তা দেখতে পাবেন:

Service [embedding-gemma] revision [embedding-gemma-12345-abc] has been deployed and is serving 100 percent of traffic.
Service URL: https://embedding-gemma-123456789012.europe-west1.run.app

৫. ডেপ্লয়মেন্টটি পরীক্ষা করুন

যেহেতু আমরা --no-allow-unauthenticated সহ সার্ভিসটি ডেপ্লয় করেছি, তাই আমরা সরাসরি পাবলিক ইউআরএলটি curl করতে পারি না। প্রথমে আমাদের সার্ভিসটি অ্যাক্সেস করার জন্য নিজেদেরকে অনুমতি দিতে হবে এবং রিকোয়েস্টে অথ টোকেনটি ব্যবহার করতে হবে।

  1. পরিষেবাটি কল করার জন্য আপনার ব্যবহারকারী অ্যাকাউন্টকে অনুমতি দিন:
    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member=user:$(gcloud config get-value account) \
        --role='roles/run.invoker'
    
  2. অনুরোধে ব্যবহারের জন্য আপনার গুগল ক্লাউড ক্রেডেনশিয়াল এবং প্রজেক্ট নম্বর এনভায়রনমেন্ট ভেরিয়েবলে সংরক্ষণ করুন:
    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
    export ID_TOKEN=$(gcloud auth print-identity-token)
    
  3. 'নমুনা টেক্সট'-এর জন্য একটি এমবেডিং তৈরি করতে নিম্নলিখিত কমান্ডটি চালান:
    curl -X POST "https://embedding-gemma-$PROJECT_NUMBER.europe-west1.run.app/api/embed" \
        -H "Authorization: Bearer $ID_TOKEN" \
        -H "Content-Type: application/json" \
        -d '{
            "model": "embeddinggemma",
            "input": "Sample text"
        }'
    

আপনি embedding ফিল্ডের অধীনে একটি ভেক্টর (সংখ্যার একটি দীর্ঘ তালিকা) সম্বলিত একটি JSON রেসপন্স দেখতে পাবেন। এটি নিশ্চিত করে যে আপনার সার্ভারলেস GPU-সমর্থিত এমবেডিং মডেলটি কাজ করছে!

প্রতিক্রিয়াটি দেখতে এইরকম হবে: এমবেডিং জেমা কার্ল আউটপুট

পাইথন ক্লায়েন্ট

আপনি পাইথন ব্যবহার করেও সার্ভিসটির সাথে যোগাযোগ করতে পারেন। test_client.py নামে একটি ফাইল তৈরি করুন:

import urllib.request
import urllib.parse
import json
import os

# 1. Setup the URL and Payload
url = f"https://embedding-gemma-{os.environ['PROJECT_NUMBER']}.europe-west1.run.app/api/embed"
payload = {
    "model": "embeddinggemma",
    "input": "Sample text"
}

# 2. Create the Request object
# Note: Providing 'data' automatically makes this a POST request
req = urllib.request.Request(
    url,
    data=json.dumps(payload).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {os.environ['ID_TOKEN']}",
        "Content-Type": "application/json"
    }
)

# 3. Execute and print the response
response = urllib.request.urlopen(req)
result = json.loads(response.read().decode("utf-8"))
print(result)

এটা চালান:

python test_client.py

৬. একটি সিমান্টিক সার্চ অ্যাপ্লিকেশন তৈরি করুন।

এখন যেহেতু আমাদের একটি কার্যকর এমবেডিং সার্ভিস আছে, চলুন একটি সাধারণ সিমান্টিক সার্চ অ্যাপ্লিকেশন তৈরি করি। আমরা একটি নির্দিষ্ট কোয়েরির জন্য সবচেয়ে প্রাসঙ্গিক ডকুমেন্টটি খুঁজে বের করতে জেনারেট করা এমবেডিংগুলো ব্যবহার করব।

নির্ভরশীলতা

আমরা আমাদের ভেক্টর ডাটাবেস হিসেবে chromadb এবং ollama ক্লায়েন্ট লাইব্রেরি ব্যবহার করব।

uv init semantic-search --description "Semantic Search Application"
cd semantic-search
uv add chromadb ollama

অনুসন্ধান অ্যাপ্লিকেশন তৈরি করুন

নিম্নলিখিত কোড সহ semantic_search.py ​​নামে একটি ফাইল তৈরি করুন:

import ollama
import chromadb
import os

# 1. Define our knowledge base
documents = [
    "Poland is a country located in Central Europe.",
    "The capital and largest city of Poland is Warsaw.",
    "Poland's official language is Polish, which is a West Slavic language.",
    "Marie Curie, the pioneering scientist who conducted groundbreaking research on radioactivity, was born in Warsaw, Poland.",
    "Poland is famous for its traditional dish called pierogi, which are filled dumplings.",
    "The Białowieża Forest in Poland is one of the last and largest remaining parts of the immense primeval forest that once stretched across the European Plain.",
]

print("Initializing Vector Database...")
client = chromadb.Client()
collection = client.create_collection(name="docs")

# Configure the client to point to our Cloud Run proxy
ollama_client = ollama.Client(
    host=f"https://embedding-gemma-{os.environ['PROJECT_NUMBER']}.europe-west1.run.app",
    headers={'Authorization': 'Bearer ' + os.environ['ID_TOKEN']}
)

print("Generating embeddings and indexing documents...")
# 2. Store each document in the vector database
for i, d in enumerate(documents):
    # This calls our Cloud Run service to get the embedding
    response = ollama_client.embed(model="embeddinggemma", input=d)
    embeddings = response["embeddings"]
    collection.add(ids=[str(i)], embeddings=embeddings, documents=[d])

print("Indexing complete.\n")

# 3. Perform a Semantic Search
question = "What is Poland's official language?"
print(f"Query: {question}")

# Generate an embedding for the question
response = ollama_client.embed(model="embeddinggemma", input=question)

# Query the database for the most similar document
results = collection.query(
    query_embeddings=[response["embeddings"][0]],
    n_results=1
)

best_match = results["documents"][0][0]
print(f"Best Match Document: {best_match}")

অ্যাপ্লিকেশনটি চালান

স্ক্রিপ্টটি চালান:

uv run semantic_search.py

আপনি এর অনুরূপ আউটপুট দেখতে পাবেন:

Initializing Vector Database...
Generating embeddings and indexing documents...
Indexing complete.

Query: What is Poland's official language?
Best Match Document: Poland's official language is Polish, which is a West Slavic language.

এই স্ক্রিপ্টটি একটি RAG সিস্টেমের মূল অংশ প্রদর্শন করে: আপনার সার্ভারলেস EmbeddingGemma পরিষেবা ব্যবহার করে ডকুমেন্ট এবং কোয়েরি উভয়কেই ভেক্টরে রূপান্তর করা, যা আপনাকে একজন ব্যবহারকারীর প্রশ্নের উত্তর দেওয়ার জন্য প্রয়োজনীয় সঠিক তথ্য খুঁজে পেতে সক্ষম করে।

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

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

ক্লাউড রান পরিষেবাটি মুছে ফেলুন

gcloud run services delete embedding-gemma --region europe-west1 --quiet

কন্টেইনার ইমেজটি মুছে ফেলুন

gcloud artifacts docker images delete \
    europe-west1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/cloud-run-source-deploy/embedding-gemma \
    --quiet

৮. অভিনন্দন

অভিনন্দন! আপনি সফলভাবে GPU সহ ক্লাউড রান -এ EmbeddingGemma স্থাপন করেছেন এবং এটি ব্যবহার করে একটি সিম্যান্টিক সার্চ অ্যাপ্লিকেশন পরিচালনা করেছেন।

পাঠ্যের অর্থ বোঝার ক্ষমতা সম্পন্ন এআই অ্যাপ্লিকেশন তৈরির জন্য আপনার কাছে এখন একটি পরিবর্ধনযোগ্য ও সার্ভারবিহীন ভিত্তি রয়েছে।

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

  • ডকার ব্যবহার করে কীভাবে একটি ওলামা মডেলকে কন্টেইনারাইজ করা যায়।
  • ক্লাউড রানে কীভাবে একটি জিপিইউ-সক্ষম পরিষেবা স্থাপন করবেন
  • সিমান্টিক সার্চের (RAG) জন্য ডেপ্লয়েড মডেলটি কীভাবে ব্যবহার করবেন।

পরবর্তী পদক্ষেপ

রেফারেন্স নথি