অনুমানের জন্য কর্মী পুল হিসেবে ওল্লামাকে কীভাবে হোস্ট করবেন

১. ভূমিকা

সংক্ষিপ্ত বিবরণ

এই কোডল্যাবে, আপনি একটি ইভেন্ট-ড্রাইভেন, অ্যাসিঙ্ক্রোনাস এআই প্রসেসিং পাইপলাইন তৈরি করতে শিখবেন। আপনি Ollama ব্যবহার করে একটি ক্লাউড রান ওয়ার্কার পুলে একটি ওপেন-সোর্স মডেল ডেপ্লয় করবেন। ওয়ার্কার পুলটি একটি পাব/সাব টপিক থেকে মেসেজ গ্রহণ করে এবং একটি gemma3:4b মডেল ব্যবহার করে সেগুলোকে প্রসেস করে।

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

  • পাব/সাব পুল সাবস্ক্রিপশনের সাথে ওয়ার্কার পুল কীভাবে ব্যবহার করবেন
  • ওয়ার্কার পুল হিসেবে ইনফারেন্স করার জন্য কীভাবে Ollama ব্যবহার করবেন

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

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

এই কোডল্যাবটি ব্যবহার শুরু করার আগে, নিম্নলিখিত API-গুলি সক্রিয় করতে রান করুন:

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

৩. সেটআপ এবং প্রয়োজনীয়তা

প্রয়োজনীয় রিসোর্সগুলো সেট আপ করতে, এই ধাপগুলো অনুসরণ করুন:

  1. এই কোডল্যাবের জন্য এনভায়রনমেন্ট ভেরিয়েবল সেট করুন:
export PROJECT_ID=<YOUR_PROJECT_ID>
export REGION=<YOUR_REGION>

export BUCKET_NAME=$PROJECT_ID-gemma3-4b
export SERVICE_ACCOUNT_NAME=ollama-worker-sa
export SERVICE_ACCOUNT_EMAIL=${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
export TOPIC_NAME=ollama-prompts
export SUBSCRIPTION_NAME=ollama-prompts-sub
export AR_REPO_NAME=ollama-worker-repo
export PULL_MSG_IMAGE_NAME=pubsub-pull-msg
export OLLAMA_IMAGE_NAME=ollama-coordinator
  1. ওয়ার্কার পুলের জন্য একটি সার্ভিস অ্যাকাউন্ট তৈরি করুন
gcloud iam service-accounts create ${SERVICE_ACCOUNT_NAME} \
  --display-name="Ollama Worker Service Account"
  1. SA-কে Pub/Sub-এ অ্যাক্সেস দিন
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
  --role="roles/pubsub.subscriber"
  1. ওয়ার্কার পুল ইমেজের জন্য একটি AR রিপোজিটরি তৈরি করুন
gcloud artifacts repositories create ${AR_REPO_NAME} \
  --repository-format=docker \
  --location=${REGION}
  1. PubSub টপিক এবং সাবস্ক্রিপশন তৈরি করুন
gcloud pubsub topics create $TOPIC_NAME
gcloud pubsub subscriptions create $SUBSCRIPTION_NAME --topic $TOPIC_NAME

৪. মডেলটি ডাউনলোড করে GCS-এ হোস্ট করুন।

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

  1. আপনার স্থানীয় মেশিনে Ollama ইনস্টল করুন:

লিনাক্সে Ollama ইনস্টল করতে নিম্নলিখিত কমান্ডটি চালান। অন্যান্য অপারেটিং সিস্টেমের জন্য, অনুগ্রহ করে Ollama ওয়েবসাইট দেখুন।

curl -fsSL https://ollama.com/install.sh | sh
  1. ওলামা পরিষেবাটি চালু করুন এবং মডেলটি বের করুন:

প্রথমে, ব্যাকগ্রাউন্ডে ওলামা সার্ভিসটি চালু করুন।

ollama serve &
ollama pull gemma3:4b
  1. একটি GCS বাকেট তৈরি করুন:

পূর্বে সেট করা BUCKET_NAME এনভায়রনমেন্ট ভেরিয়েবলটি ব্যবহার করে GCS বাকেটটি তৈরি করুন।

gsutil mb gs://${BUCKET_NAME}
  1. মডেল ফাইলগুলো আপনার GCS বাকেটে আপলোড করুন:

Ollama মডেল ফাইলগুলো ~/.ollama/models ডিরেক্টরিতে সংরক্ষণ করে। এই ডিরেক্টরির বিষয়বস্তু আপনার GCS বাকেটে আপলোড করুন। এতে আপনার ডাউনলোড করা সমস্ত মডেল কপি হয়ে যাবে।

gsutil -m cp -r ~/.ollama/models/* gs://${BUCKET_NAME}/
  1. SA-কে ক্লাউড স্টোরেজ বাকেটে অ্যাক্সেস দিন।
gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \
     --member=serviceAccount:${SERVICE_ACCOUNT_EMAIL} \
     --role=roles/storage.objectViewer

৫. ক্লাউড রান জবটি তৈরি করুন

ক্লাউড রান জবটি ২টি কন্টেইনার ব্যবহার করে:

  • ollama-coordinator - ollama হোস্ট করার জন্য এবং gemma 3 4B মডেলটি পরিবেশন করার জন্য
  • pubsub-pull-msg - পাবসাব সাবস্ক্রিপশন থেকে মেসেজ টেনে এনে ollama-coordinator কন্টেইনারে পাঠানোর জন্য।

প্রথমে, আপনাকে ollama-coordinator কন্টেইনারটি তৈরি করতে হবে।

  1. কোডল্যাবের জন্য একটি প্যারেন্ট ডিরেক্টরি তৈরি করুন:
mkdir codelab-ollama-wp
cd codelab-ollama-wp
  1. ollama-coordinator কন্টেইনারের জন্য একটি ডিরেক্টরি তৈরি করুন
mkdir ollama-coordinator
cd ollama-coordinator
  1. নিম্নলিখিত বিষয়বস্তু সহ একটি Dockerfile তৈরি করুন।
# Use the official Ollama image as a base image
FROM ollama/ollama

# Expose the port that Ollama listens on
EXPOSE 11434

# Set the entrypoint to start the Ollama server
ENTRYPOINT ["ollama", "serve"]
  1. ওলামা কন্টেইনার তৈরি করুন
gcloud builds submit --tag ${REGION}-docker.pkg.dev/${PROJECT_ID}/${AR_REPO_NAME}/${OLLAMA_IMAGE_NAME} --timeout=20m

এরপরে, আপনি pubsub-pull-msg কন্টেইনারটি তৈরি করবেন।

  1. pubsub-pull-msg কন্টেইনারের জন্য একটি ডিরেক্টরি তৈরি করুন
cd ..
mkdir pubsub-pull-msg
cd pubsub-pull-msg
  1. একটি Dockerfile তৈরি করুন
# Use the official Python image as a base image
FROM python:3.9-slim

# Set the working directory in the container
WORKDIR /app

# Copy the requirements file into the container
COPY requirements.txt .

# Install the required Python packages
RUN pip install --no-cache-dir -r requirements.txt

# Copy the Python script into the container
COPY main.py .

# Set the entrypoint to run the Python script
CMD ["python", "main.py"]
  1. নিম্নলিখিত বিষয়বস্তু সহ একটি requirements.txt ফাইল তৈরি করুন।
google-cloud-pubsub
requests
  1. নিম্নলিখিত বিষয়বস্তু সহ একটি main.py ফাইল তৈরি করুন।
import os
import sys
import requests
import json
from google.cloud import pubsub_v1

# --- Main Application Logic ---
print("--- Sidecar container script started ---")

# --- Environment and Configuration ---
project_id = os.environ.get("PROJECT_ID")
subscription_name = os.environ.get("SUBSCRIPTION_NAME")
ollama_api_url = "http://localhost:11434/api/generate"

if not project_id or not subscription_name:
    print("FATAL: PROJECT_ID and SUBSCRIPTION_NAME must be set.")
    sys.exit(1)

print(f"PROJECT_ID: {project_id}")
print(f"SUBSCRIPTION_NAME: {subscription_name}")

def callback(message):
    """Processes a single Pub/Sub message."""
    print(f"Received message ID: {message.message_id}")
    try:
        prompt = message.data.decode("utf-8")
        print(f"Decoded prompt: '{prompt}'")
        
        data = {"model": "gemma3:4b", "prompt": prompt, "stream": False}
        
        print("Sending request to Ollama...")
        response = requests.post(ollama_api_url, json=data, timeout=300)
        response.raise_for_status()
        
        print("Successfully received response from Ollama.")
        ollama_response = response.json()
        print(f"Ollama response: {json.dumps(ollama_response)[:200]}...")

        message.ack()
        print(f"Message {message.message_id} acknowledged.")

    except requests.exceptions.RequestException as e:
        print(f"Error calling Ollama API: {e}")
        message.nack()
        print(f"Message {message.message_id} not acknowledged.")
    except Exception as e:
        print(f"An unexpected error occurred in callback: {e}")
        message.nack()
        print(f"Message {message.message_id} not acknowledged.")

def main():
    """Starts the Pub/Sub subscriber."""
    subscriber = pubsub_v1.SubscriberClient()
    subscription_path = subscriber.subscription_path(project_id, subscription_name)
    
    streaming_pull_future = subscriber.subscribe(subscription_path, callback=callback)
    print(f"Subscribed to {subscription_path}. Listening for messages...")

    try:
        # .result() will block indefinitely.
        streaming_pull_future.result()
    except Exception as e:
        print(f"A fatal error occurred in the subscriber: {e}")
        streaming_pull_future.cancel()
        streaming_pull_future.result()

if __name__ == "__main__":
    main()
  1. এখন pubsub-pull-msg কন্টেইনারটি তৈরি করুন।
gcloud builds submit --tag ${REGION}-docker.pkg.dev/${PROJECT_ID}/${AR_REPO_NAME}/${PULL_MSG_IMAGE_NAME}

৬. কাজটি স্থাপন ও সম্পাদন করুন

এই ধাপে, আপনি একটি yaml ফাইল ডেপ্লয় করে ক্লাউড রান জবটি তৈরি করবেন।

yaml ফাইলটি তৈরি করতে রুট ফোল্ডারে যান।

cd ..
  1. নিম্নলিখিত বিষয়বস্তু সহ worker-pool.template.yaml একটি ফাইল তৈরি করুন।
apiVersion: run.googleapis.com/v1
kind: WorkerPool
metadata:
  name: codelab-ollama-wp
  labels:
    cloud.googleapis.com/location: europe-west1
  annotations:
    run.googleapis.com/launch-stage: BETA
    run.googleapis.com/scalingMode: manual
    run.googleapis.com/manualInstanceCount: '1'
    run.googleapis.com/gcs-fuse-mounter-enabled: "true"
spec:
  template:
    metadata:
      annotations:
        run.googleapis.com/gpu: "1"
        run.googleapis.com/gpu-zonal-redundancy-disabled: 'true'        
    spec:
      serviceAccountName: ${SERVICE_ACCOUNT_EMAIL}
      nodeSelector:
        run.googleapis.com/accelerator: nvidia-l4
      volumes:
      - name: gcs-bucket
        csi:
          driver: gcsfuse.run.googleapis.com
          readOnly: true
          volumeAttributes: 
            bucketName: ${BUCKET_NAME}
      containers:
      - image: ${REGION}-docker.pkg.dev/${PROJECT_ID}/${AR_REPO_NAME}/${PULL_MSG_IMAGE_NAME}
        name: pubsub-pull-msg
        env:
        - name: PROJECT_ID
          value: ${PROJECT_ID}
        - name: SUBSCRIPTION_NAME
          value: "ollama-prompts-sub"
        - name: PYTHONUNBUFFERED
          value: "1"
        resources:
          limits:
            cpu: '1'
            memory: 1Gi
      - image: ${REGION}-docker.pkg.dev/${PROJECT_ID}/${AR_REPO_NAME}/${OLLAMA_IMAGE_NAME}
        name: ollama-coordinator
        env:
        - name: OLLAMA_MODELS
          value: /mnt/models
        volumeMounts:
        - name: gcs-bucket
          mountPath: /mnt/models
        resources:
          limits:
            cpu: '6'
            nvidia.com/gpu: '1'
            memory: 16Gi

এরপর, সম্পূর্ণ ইমেজ ইউআরএলগুলো নির্ধারণ করুন এবং টেমপ্লেট ফাইলে ভেরিয়েবলগুলো প্রতিস্থাপন করতে sed ​​ব্যবহার করে চূড়ান্ত worker-pool.yaml তৈরি করুন।

sed -e "s|\${SERVICE_ACCOUNT_EMAIL}|${SERVICE_ACCOUNT_EMAIL}|g" \
     -e "s|\${BUCKET_NAME}|${BUCKET_NAME}|g" \
     -e "s|\${PULL_MSG_IMAGE_NAME}|${PULL_MSG_IMAGE_NAME}|g" \
     -e "s|\${OLLAMA_IMAGE_NAME}|${OLLAMA_IMAGE_NAME}|g" \
     -e "s|\${PROJECT_ID}|${PROJECT_ID}|g" \
     -e "s|\${REGION}|${REGION}|g" \
     -e "s|\${AR_REPO_NAME}|${AR_REPO_NAME}|g" \
     worker-pool.template.yaml > worker-pool.yaml

এখন আপনি স্থাপন করতে পারেন

gcloud beta run worker-pools replace worker-pool.yaml

এবং পরীক্ষা

gcloud pubsub topics publish ${TOPIC_NAME} --message="What is 1 + 1?"

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

gcloud alpha run worker-pools logs read "codelab-ollama-wp" --limit 10

এবং আপনার এমন কিছু দেখা উচিত যা বলে

Ollama response: {"model": "gemma3:4b", "created_at": "2025-11-06T23:48:39.572079369Z", "response": "1 + 1 = 2\n", ...

৭. অভিনন্দন!

কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন!

আমরা ক্লাউড রান ডকুমেন্টেশন পর্যালোচনা করার পরামর্শ দিই।

আমরা যা আলোচনা করেছি

  • পাব/সাব পুল সাবস্ক্রিপশনের সাথে ক্লাউড রান ওয়ার্কার পুল কীভাবে ব্যবহার করবেন
  • ক্লাউড রান ওয়ার্কার পুল হিসেবে ইনফারেন্স করার জন্য কীভাবে Ollama ব্যবহার করবেন

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

এই টিউটোরিয়ালে ব্যবহৃত রিসোর্সগুলোর জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ হওয়া এড়াতে, হয় রিসোর্সগুলো যে প্রজেক্টে রয়েছে সেটি ডিলিট করে দিন, অথবা প্রজেক্টটি রেখে দিয়ে আলাদা আলাদা রিসোর্সগুলো ডিলিট করে দিন।

প্রকল্পটি মুছে ফেলা হচ্ছে

বিলিং বন্ধ করার সবচেয়ে সহজ উপায় হলো টিউটোরিয়ালের জন্য তৈরি করা প্রজেক্টটি ডিলিট করে দেওয়া।

প্রজেক্টটি ডিলিট করতে:

  1. গুগল ক্লাউড কনসোলে, 'ম্যানেজ রিসোর্সেস' পৃষ্ঠায় যান।
  2. প্রজেক্ট তালিকা থেকে, আপনি যে প্রজেক্টটি মুছতে চান সেটি নির্বাচন করুন এবং তারপর ডিলিট বোতামে ক্লিক করুন।
  3. ডায়ালগ বক্সে প্রজেক্ট আইডি টাইপ করুন এবং তারপর প্রজেক্টটি মুছে ফেলার জন্য 'শাট ডাউন'-এ ক্লিক করুন।

স্বতন্ত্র সম্পদ মুছে ফেলা

স্বতন্ত্র রিসোর্সগুলো মুছে ফেলার জন্য, নিম্নলিখিত কমান্ডগুলো চালান:

  1. ক্লাউড রান ওয়ার্কার পুলটি মুছে ফেলুন:
gcloud beta run worker-pools delete codelab-ollama-wp --region ${REGION}
  1. GCS বাকেটটি মুছে ফেলুন:
gsutil -m rm -r gs://${BUCKET_NAME}
  1. পাব/সাব সাবস্ক্রিপশন এবং টপিকটি মুছে ফেলুন:
gcloud pubsub subscriptions delete ${SUBSCRIPTION_NAME}
gcloud pubsub topics delete ${TOPIC_NAME}
  1. আর্টিফ্যাক্ট রেজিস্ট্রি রিপোজিটরিটি মুছে ফেলুন:
gcloud artifacts repositories delete ${AR_REPO_NAME} --location=${REGION} --quiet
  1. পরিষেবা অ্যাকাউন্টটি মুছে ফেলুন:
gcloud iam service-accounts delete ${SERVICE_ACCOUNT_EMAIL} --quiet

স্থানীয় ফাইলগুলি পরিষ্কার করা হচ্ছে

স্থানীয় ফাইলগুলো পরিষ্কার করতে, নিম্নলিখিত পদক্ষেপগুলো অনুসরণ করুন:

  1. স্থানীয় Ollama পরিষেবা বন্ধ করুন: আপনি যদি ollama serve & দিয়ে Ollama চালু করে থাকেন, তাহলে এর প্রসেস আইডি (PID) খুঁজে ` kill কমান্ড ব্যবহার করে এটিকে বন্ধ করতে পারেন।
    # Find the process ID of the Ollama server
    pgrep ollama
    
    # Replace <PID> with the actual process ID obtained from the previous command
    kill <PID>
    
  2. ডাউনলোড করা মডেলগুলো মুছে ফেলুন:
rm -rf ~/.ollama/models
  1. ওল্লামা আনইনস্টল করুন:

আপনার স্থানীয় মেশিন থেকে Ollama আনইনস্টল করতে Ollama ওয়েবসাইটের নির্দেশাবলী অনুসরণ করুন।