Kubernetes-এ Gemma 4-এর সাথে AlloyDB Omni এবং EmbeddingGemma

১. ভূমিকা

এই কোডল্যাবে, আপনি শিখবেন কীভাবে গুগল কুবারনেটিস ইঞ্জিন (GKE)-এ AlloyDB Omni ডেপ্লয় করতে হয় এবং এমবেডিং ও প্রেডিকশনের জন্য EmbeddingGemmaGemma 4-এর মতো ওপেন মডেলের সাথে এটি ব্যবহার করতে হয়। একই ক্লাস্টারে ডাটাবেস এবং মডেল উভয়ই চালানোর ফলে নেটওয়ার্ক ল্যাটেন্সি কমে যায় এবং থার্ড-পার্টি সার্ভিসের উপর নির্ভরতা এড়ানো যায়। এটি কমপ্লায়েন্স এবং ডেটা রেসিডেন্সি রিকোয়ারমেন্ট পূরণেও সাহায্য করে, কারণ আপনার ডেটা কখনোই আপনার এনভায়রনমেন্টের বাইরে যায় না।

GKE-তে AlloyDB Omni এবং EmbeddingGemma-এর আর্কিটেকচার ডায়াগ্রাম

পূর্বশর্ত

  • গুগল ক্লাউড এবং গুগল ক্লাউড কনসোল সম্পর্কে প্রাথমিক ধারণা
  • Kubernetes এবং GKE সম্পর্কে প্রাথমিক জ্ঞান
  • কমান্ড-লাইন ইন্টারফেস এবং গুগল ক্লাউড শেল সম্পর্কে পরিচিতি

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

  • একটি GKE ক্লাস্টারে AlloyDB Omni কীভাবে স্থাপন করবেন
  • AlloyDB Omni-এর সাথে কীভাবে সংযোগ করবেন
  • AlloyDB Omni-তে কীভাবে ডেটা লোড করবেন
  • GKE-তে AI মডেল (এম্বেডিং এবং LLM) কীভাবে স্থাপন করবেন
  • AlloyDB Omni-তে AI মডেলগুলি কীভাবে নিবন্ধন করবেন
  • সিমান্টিক সার্চের জন্য এমবেডিং কীভাবে তৈরি করবেন
  • AlloyDB Omni-তে কীভাবে সিমান্টিক সার্চ কোয়েরি চালাবেন
  • AlloyDB Omni-তে ভেক্টর ইনডেক্স কীভাবে তৈরি এবং ব্যবহার করবেন

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

  • একটি গুগল ক্লাউড অ্যাকাউন্ট এবং গুগল ক্লাউড প্রজেক্ট
  • ক্রোমের মতো একটি ওয়েব ব্রাউজার

২. স্থাপন ও প্রয়োজনীয়তা

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

  1. গুগল ক্লাউড কনসোলে সাইন ইন করুন। যদি আপনার আগে থেকে জিমেইল বা গুগল ওয়ার্কস্পেস অ্যাকাউন্ট না থাকে, তাহলে একটি তৈরি করুন । কর্মক্ষেত্র বা শিক্ষা প্রতিষ্ঠানের অ্যাকাউন্টের পরিবর্তে একটি ব্যক্তিগত অ্যাকাউন্ট ব্যবহার করুন।
  1. একটি নতুন প্রজেক্ট তৈরি করুন অথবা একটি বিদ্যমান প্রজেক্ট নির্বাচন করুন। গুগল ক্লাউড কনসোল হেডারে, ' Select a project'- এ ক্লিক করুন, তারপর 'New Project'-এ ক্লিক করুন।

গুগল ক্লাউড কনসোলে একটি প্রজেক্ট নির্বাচন করার ডায়ালগ বক্স

'প্রজেক্ট নির্বাচন করুন' উইন্ডোতে, প্রজেক্ট তৈরির ডায়ালগ বক্সটি খুলতে 'নতুন প্রজেক্ট'- এ ক্লিক করুন।

নতুন প্রজেক্ট তৈরির ডায়ালগ

ডায়ালগ বক্সে একটি প্রজেক্টের নাম লিখুন এবং আপনার প্রতিষ্ঠান বা অবস্থান নির্বাচন করুন।

প্রকল্পের বিবরণ ইনপুট ক্ষেত্রগুলি

  • প্রজেক্টের নামটি এই প্রজেক্টের অংশগ্রহণকারীদের জন্য প্রদর্শিত নাম। প্রজেক্টের নামটি গুগল এপিআই দ্বারা ব্যবহৃত হয় না এবং আপনি যেকোনো সময় এটি পরিবর্তন করতে পারেন।
  • প্রজেক্ট আইডি সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে অনন্য এবং অপরিবর্তনীয় (একবার সেট করার পর আপনি এটি পরিবর্তন করতে পারবেন না)। গুগল ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য আইডি তৈরি করে, অথবা আপনি আপনার নিজের আইডি সরবরাহ করতে পারেন। এই কোডল্যাবে, আপনি আপনার প্রজেক্ট আইডি উল্লেখ করবেন। স্থানধারক।
  • প্রজেক্ট নম্বর হলো একটি তৃতীয় শনাক্তকারী যা কিছু এপিআই (API) ব্যবহার করে। আরও তথ্যের জন্য, রিসোর্স ম্যানেজার ডকুমেন্টেশন দেখুন।

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

আপনি যদি গুগল ক্লাউড ক্রেডিট ব্যবহার করে বিলিং সেট আপ করেন, তাহলে এই ধাপটি এড়িয়ে যেতে পারেন।

একটি ব্যক্তিগত বিলিং অ্যাকাউন্ট তৈরি করতে, গুগল ক্লাউড কনসোলে বিলিং চালু করুন।

  • এই ল্যাবটি সম্পন্ন করতে গুগল ক্লাউড রিসোর্সে ৫ মার্কিন ডলারেরও কম খরচ হয়।
  • অতিরিক্ত চার্জ এড়াতে এবং রিসোর্স মুছে ফেলার জন্য এই ল্যাবের শেষে দেওয়া পরিষ্করণ ধাপগুলো অনুসরণ করুন।
  • নতুন ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়ালের জন্য যোগ্য।

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

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

গুগল ক্লাউড কনসোল থেকে, উপরের ডানদিকের টুলবারে থাকা ‘Activate Cloud Shell’ আইকনটিতে ক্লিক করুন:

ক্লাউড শেল বাটন সক্রিয় করুন

বিকল্পভাবে, প্রথমে G তারপর S চাপুন, অথবা সরাসরি Google Cloud Shell খুলুন।

সংযুক্ত হলে, ক্লাউড শেল টার্মিনাল প্রম্পট প্রদর্শন করে:

গুগল ক্লাউড শেল টার্মিনালের স্ক্রিনশট

ক্লাউড শেলে স্থায়ী স্টোরেজ এবং ডেভেলপমেন্ট টুলস রয়েছে। আপনি এই কোডল্যাবের সমস্ত ধাপ আপনার ব্রাউজার থেকে চালাতে পারেন।

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

AlloyDB Omni এবং মডেল ডেপ্লয়মেন্টের জন্য Google Kubernetes Engine (GKE) ব্যবহার করতে, আপনার Google Cloud প্রজেক্টে Compute Engine এবং GKE API-গুলো সক্রিয় করুন।

ক্লাউড শেলে, আপনার প্রজেক্ট আইডি কনফিগার করা আছে কিনা তা যাচাই করুন:

PROJECT_ID=$(gcloud config get-value project)
echo $PROJECT_ID

আপনার প্রজেক্ট আইডি সংজ্ঞায়িত না থাকলে, এটি কনফিগার করুন:

export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID

প্রয়োজনীয় API-গুলো সক্রিয় করুন:

gcloud services enable compute.googleapis.com
gcloud services enable container.googleapis.com

প্রত্যাশিত আউটপুট:

student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=test-project-001-402417
student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable compute.googleapis.com
gcloud services enable container.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

আপনি ডকুমেন্টেশনে প্রতিটি সক্রিয় API সম্পর্কে পড়তে পারেন।

৪. GKE-তে AlloyDB Omni স্থাপন করুন

GKE-তে AlloyDB Omni স্থাপন করতে, AlloyDB Omni অপারেটরের প্রয়োজনীয়তাগুলো অনুসরণ করে একটি Kubernetes ক্লাস্টার প্রস্তুত করুন।

একটি GKE ক্লাস্টার তৈরি করুন

AlloyDB Omni, অপারেটর এবং মনিটরিং কন্টেইনার চালানোর সক্ষমতাসহ একটি স্ট্যান্ডার্ড GKE ক্লাস্টার স্থাপন করুন। AlloyDB Omni-এর জন্য কমপক্ষে দুটি সিপিইউ এবং ৮ জিবি র‍্যাম প্রয়োজন। এই টিউটোরিয়ালে n2-standard-4 মেশিন টাইপটি ব্যবহার করা হয়েছে।

আপনার ডেপ্লয়মেন্টের জন্য এনভায়রনমেন্ট ভেরিয়েবল সেট করুন:

export PROJECT_ID=$(gcloud config get-value project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
export MACHINE_TYPE=n2-standard-4

স্ট্যান্ডার্ড GKE ক্লাস্টার তৈরি করুন:

gcloud container clusters create ${CLUSTER_NAME} \
  --project=${PROJECT_ID} \
  --region=${LOCATION} \
  --workload-pool=${PROJECT_ID}.svc.id.goog \
  --release-channel=rapid \
  --machine-type=${MACHINE_TYPE} \
  --num-nodes=1

প্রত্যাশিত কনসোল আউটপুট:

student@cloudshell:~ (test-project-001-402417)$ export PROJECT_ID=$(gcloud config get project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
export MACHINE_TYPE=n2-standard-4
Your active configuration is: [test-project-001-402417]
student@cloudshell:~ (test-project-001-402417)$ gcloud container clusters create ${CLUSTER_NAME} \
  --project=${PROJECT_ID} \
  --region=${LOCATION} \
  --workload-pool=${PROJECT_ID}.svc.id.goog \
  --release-channel=rapid \
  --machine-type=${MACHINE_TYPE} \
  --num-nodes=1
Note: Your Pod address range (`--cluster-ipv4-cidr`) can accommodate at most 1008 node(s).
Creating cluster alloydb-ai-gke in us-central1... Cluster is being health-checked (Kubernetes Control Plane is healthy)...done.                                                                                            
Created [https://container.googleapis.com/v1/projects/test-project-001-402417/zones/us-central1/clusters/alloydb-ai-gke].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1/alloydb-ai-gke?project=test-project-001-402417
kubeconfig entry generated for alloydb-ai-gke.
NAME: alloydb-ai-gke
LOCATION: us-central1
MASTER_VERSION: 1.36.3-gke.1640000
MASTER_IP: 34.121.243.65
MACHINE_TYPE: n2-standard-4
NODE_VERSION: 1.36.3-gke.1640000
NUM_NODES: 3
STATUS: RUNNING
STACK_TYPE: IPV4

ক্লাস্টার প্রস্তুত করুন

প্রয়োজনীয় কম্পোনেন্ট যেমন cert-manager , যা Kubernetes-এর নেটিভ সার্টিফিকেট কন্ট্রোলার, ইনস্টল করুন। বিস্তারিত জানতে, cert-manager ইনস্টলেশন ডকুমেন্টেশন দেখুন।

ক্লাউড শেলে কুবারনেটিস কমান্ড-লাইন টুল kubectl অন্তর্ভুক্ত রয়েছে। gcloud ব্যবহার করে ক্লাস্টার ক্রেডেনশিয়াল সংগ্রহ করুন:

gcloud container clusters get-credentials ${CLUSTER_NAME} --region=${LOCATION}

kubectl ব্যবহার করে cert-manager ইনস্টল করুন:

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.21.1/cert-manager.yaml

প্রত্যাশিত কনসোল আউটপুট (সংশোধিত):

student@cloudshell:~$ kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.21.1/cert-manager.yaml
namespace/cert-manager created
customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created
...
validatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created

AlloyDB Omni অপারেটর ইনস্টল করুন

Helm ব্যবহার করে AlloyDB Omni অপারেটরটি ইনস্টল করুন।

AlloyDB Omni অপারেটর চার্টটি ডাউনলোড এবং ইনস্টল করুন:

helm install alloydbomni-operator oci://gcr.io/alloydb-omni/alloydbomni-operator \
--version 1.8.1 \
--create-namespace \
--namespace alloydb-omni-system \
--atomic \
--timeout 5m

প্রত্যাশিত কনসোল আউটপুট (সংশোধিত):

student@cloudshell:~$ helm install alloydbomni-operator oci://gcr.io/alloydb-omni/alloydbomni-operator \
> --version 1.8.0 \
> --create-namespace \
> --namespace alloydb-omni-system \
> --atomic \
> --timeout 5m
Flag --atomic has been deprecated, use --rollback-on-failure instead
Pulled: gcr.io/alloydb-omni/alloydbomni-operator:1.8.0
Digest: sha256:f2d98fa7a3b08dfc1e83b811582718b94e5c017b81aade700c83e917c59f0395
NAME: alloydbomni-operator
LAST DEPLOYED: Thu Aug 27 17:57:30 2026
NAMESPACE: alloydb-omni-system
STATUS: deployed
REVISION: 1
DESCRIPTION: Install complete
TEST SUITE: None

ডাটাবেস ক্লাস্টারটি স্থাপন করুন।

নিম্নলিখিত ম্যানিফেস্টটি googleMLExtension সক্রিয় এবং একটি অভ্যন্তরীণ লোড ব্যালেন্সার সহ একটি ডাটাবেস ক্লাস্টার কনফিগার করে:

cat << 'EOF' > my-omni.yaml
apiVersion: v1
kind: Secret
metadata:
  name: db-pw-my-omni
type: Opaque
data:
  my-omni: "VmVyeVN0cm9uZ1Bhc3N3b3Jk"
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
  name: my-omni
spec:
  databaseVersion: "18.3.0"
  primarySpec:
    adminUser:
      passwordRef:
        name: db-pw-my-omni
    features:
      googleMLExtension:
        enabled: true
    resources:
      cpu: 1
      memory: 8Gi
      disks:
      - name: DataDisk
        size: 20Gi
        storageClass: standard
    dbLoadBalancerOptions:
      annotations:
        networking.gke.io/load-balancer-type: "internal"
  allowExternalIncomingTraffic: true
EOF

পাসওয়ার্ড সিক্রেট ভ্যালুটি হলো VeryStrongPassword এর Base64 রূপ। প্রোডাকশন এনভায়রনমেন্টে পাসওয়ার্ড ম্যানেজ করার জন্য Google Secret Manager ব্যবহার করুন। বিস্তারিত জানতে, Secret Manager ডকুমেন্টেশন দেখুন।

ম্যানিফেস্টটি my-omni.yaml নামে সেভ করা হয়। ক্লাউড শেলে, টার্মিনাল উইন্ডোর উপরের ডান কোণায় থাকা ‘ওপেন এডিটর’- এ ক্লিক করুন এবং ফাইলটি পড়ুন।

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

my-omni.yaml ম্যানিফেস্টটি পড়ার পর, কমান্ড প্রম্পটে ফিরে আসার জন্য ওপেন টার্মিনাল-এ ক্লিক করুন।

ক্লাউড শেলে টার্মিনাল খুলুন

my-omni.yaml ম্যানিফেস্টটি প্রয়োগ করুন:

kubectl apply -f my-omni.yaml

প্রত্যাশিত কনসোল আউটপুট:

secret/db-pw-my-omni created
dbcluster.alloydbomni.dbadmin.goog/my-omni created

my-omni ক্লাস্টারের অবস্থা পরীক্ষা করুন:

kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default

ডেপ্লয়মেন্টের সময়, ডাটাবেস ক্লাস্টারটি বিভিন্ন সেটআপ পর্যায় অতিক্রম করে DBClusterReady অবস্থায় পৌঁছায়।

প্রত্যাশিত কনসোল আউটপুট:

$ kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default
NAME      PRIMARYENDPOINT   PRIMARYPHASE   DBCLUSTERPHASE   HAREADYSTATUS   HAREADYREASON
my-omni   10.131.0.33        Ready          DBClusterReady

ঐচ্ছিকভাবে আপনি kubectl log কমান্ড ব্যবহার করে ক্লাস্টার ডেপ্লয়মেন্ট নিরীক্ষণ করতে পারেন:

kubectl logs -l alloydbomni.internal.dbadmin.goog/dbcluster=my-omni --all-containers -f

AlloyDB Omni-এর সাথে সংযোগ করুন

ক্লাস্টার প্রস্তুত হয়ে গেলে, PostgreSQL ক্লায়েন্ট ( psql ) ব্যবহার করে ডাটাবেস পডের সাথে সংযোগ করুন। পাসওয়ার্ডটি হলো VeryStrongPassword যা my-omni.yaml এ সংজ্ঞায়িত করা আছে।

DB_CLUSTER_NAME=my-omni
DB_CLUSTER_NAMESPACE=default
DBPOD=`kubectl get pod --selector=alloydbomni.internal.dbadmin.goog/dbcluster=$DB_CLUSTER_NAME,alloydbomni.internal.dbadmin.goog/task-type=database -n $DB_CLUSTER_NAMESPACE -o jsonpath='{.items[0].metadata.name}'`
kubectl exec -ti $DBPOD -n $DB_CLUSTER_NAMESPACE -c database -- psql -h localhost -U postgres

নমুনা কনসোল আউটপুট:

DB_CLUSTER_NAME=my-omni
DB_CLUSTER_NAMESPACE=default
DBPOD=`kubectl get pod --selector=alloydbomni.internal.dbadmin.goog/dbcluster=$DB_CLUSTER_NAME,alloydbomni.internal.dbadmin.goog/task-type=database -n $DB_CLUSTER_NAMESPACE -o jsonpath='{.items[0].metadata.name}'`
kubectl exec -ti $DBPOD -n $DB_CLUSTER_NAMESPACE -c database -- psql -h localhost -U postgres
Password for user postgres:
psql (18.3)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off, ALPN: postgresql)
Type "help" for help.

postgres=#

\q টাইপ করে এন্টার চাপার মাধ্যমে psql সেশন থেকে প্রস্থান করুন:

postgres=# \q

৫. GKE-তে EmbeddingGemma মডেলটি স্থাপন করুন

স্থানীয় মডেলগুলির সাথে AlloyDB Omni AI ইন্টিগ্রেশন পরীক্ষা করার জন্য, GKE ক্লাস্টারে একটি এমবেডিং মডেল ডেপ্লয় করুন। এই টিউটোরিয়ালে গুগলের EmbeddingGemma মডেলটি ব্যবহার করা হয়েছে।

মডেলের জন্য একটি নোড পুল তৈরি করুন

মডেল ইনফারেন্স চালানোর জন্য, একটি ডেডিকেটেড নোড পুল প্রস্তুত করুন। আপনি একটি সিপিইউ-অনলি নোড পুল অথবা একটি জিপিইউ-অ্যাক্সিলারেটেড নোড পুল (যেমন এনভিডিয়া এল৪ জিপিইউ সহ g2-standard-8 ) ব্যবহার করতে পারেন। এই টিউটোরিয়ালে c3-standard-8 মেশিন টাইপের একটি সিপিইউ-ভিত্তিক নোড পুল ব্যবহার করা হয়েছে।

একটি একক-নোড সিপিইউ নোড পুল তৈরি করুন:

export PROJECT_ID=$(gcloud config get-value project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
gcloud container node-pools create cpupool \
  --project=${PROJECT_ID} \
  --location=${LOCATION} \
  --node-locations=${LOCATION}-a \
  --cluster=${CLUSTER_NAME} \
  --machine-type=c3-standard-8 \
  --num-nodes=1

প্রত্যাশিত আউটপুট:

student@cloudshell$ export PROJECT_ID=$(gcloud config get project)
Your active configuration is: [pant]
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
student@cloudshell$ gcloud container node-pools create cpupool \
>   --project=${PROJECT_ID} \
>   --location=${LOCATION} \
>   --node-locations=${LOCATION}-a \
>   --cluster=${CLUSTER_NAME} \
>   --machine-type=c3-standard-8 \
>   --num-nodes=1
Creating node pool cpupool...done.
Created [https://container.googleapis.com/v1/projects/gleb-test-short-003-483115/zones/us-central1/clusters/alloydb-ai-gke/nodePools/cpupool].
NAME     MACHINE_TYPE    DISK_SIZE_GB  NODE_VERSION
cpupool  c3-standard-8  100           1.34.1-gke.3355002

একটি হাগিং ফেস টোকেন সংগ্রহ করুন

এই টিউটোরিয়ালটি Hugging Face থেকে EmbeddingGemma মডেলটি ডেপ্লয় করে। মডেলের ওয়েটগুলো অ্যাক্সেস করার জন্য, একটি Hugging Face অ্যাক্সেস টোকেন জেনারেট করুন:

  1. Hugging Face- এ সাইন ইন করুন অথবা একটি অ্যাকাউন্ট তৈরি করুন।
  2. আপনার প্রোফাইল > অ্যাক্সেস টোকেন- এ যান।
  3. নতুন টোকেন তৈরি করুন -এ ক্লিক করুন।
  4. টোকেনটির জন্য একটি নাম লিখুন এবং রিড রোলটি নির্বাচন করুন।
  5. Create token-এ ক্লিক করুন এবং তৈরি হওয়া টোকেন ভ্যালুটি কপি করুন।
  6. আপনি যদি আগে তা না করে থাকেন, তাহলে EmbeddingGemma মডেল পেজে মডেলের শর্তাবলী গ্রহণ করুন।

ক্লাউড শেলে আপনার হাগিং ফেস টোকেন সম্বলিত একটি কুবারনেটিস সিক্রেট তৈরি করুন (টোকেন প্লেসহোল্ডারটি আপনার টোকেন দিয়ে প্রতিস্থাপন করুন):

export HF_TOKEN=<YOUR_HUGGING_FACE_TOKEN>
kubectl create secret generic hf-secret \
  --from-literal=hf_api_token=$HF_TOKEN \
  --dry-run=client -o yaml | kubectl apply -f -

ডেপ্লয়মেন্ট ম্যানিফেস্ট প্রস্তুত করুন

মডেলটি ডেপ্লয় করতে, হাগিং ফেস-এর টেক্সট এমবেডিংস ইনফারেন্স (TEI) কন্টেইনার প্যাকেজটি ব্যবহার করুন। আরও তথ্যের জন্য, হাগিং ফেস GKE TEI ডকুমেন্টেশন দেখুন।

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

git clone https://github.com/huggingface/Google-Cloud-Containers

সিপিইউ কনফিগারেশন ম্যানিফেস্ট পরিদর্শন ও সংশোধন করুন:

edit Google-Cloud-Containers/examples/gke/tei-deployment/cpu-config/deployment.yaml

সিপিইউ ডেপ্লয়মেন্টের জন্য আপডেট করা ম্যানিফেস্ট:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tei-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tei-server
  template:
    metadata:
      labels:
        app: tei-server
        hf.co/model: Google--embeddinggemma-300m
        hf.co/task: text-embeddings
    spec:
      containers:
        - name: tei-container
          image: ghcr.io/huggingface/text-embeddings-inference:cpu-latest
          resources:
            requests:
              cpu: "6"
              memory: "24Gi"
            limits:
              cpu: "6"
              memory: "24Gi"
          env:
            - name: MODEL_ID
              value: google/embeddinggemma-300m
            - name: NUM_SHARD
              value: "1"
            - name: PORT
              value: "8080"
            - name: HF_TOKEN
              valueFrom:
                secretKeyRef:
                  name: hf-secret
                  key: hf_api_token
          volumeMounts:
            - mountPath: /tmp
              name: tmp
      volumes:
        - name: tmp
          emptyDir: {}
      nodeSelector:
        cloud.google.com/machine-family: "c3"

ctrl+s চেপে পরিবর্তনগুলো সংরক্ষণ করুন এবং টার্মিনালে ফিরে যান।

মডেলটি স্থাপন করুন

TEI সার্ভার স্থাপন করতে ম্যানিফেস্টটি প্রয়োগ করুন:

kubectl apply -f Google-Cloud-Containers/examples/gke/tei-deployment/cpu-config

ডেপ্লয়মেন্টটি প্রস্তুত অবস্থায় না আসা পর্যন্ত পর্যবেক্ষণ করুন:

printf "Waiting for model to load..."; until kubectl logs -l app=tei-server --tail=50 2>/dev/null | grep -q "Ready"; do printf "."; sleep 3; done; printf '\n\033[1;32m========================================\n[SUCCESS] Model is loaded and ready!\nYou can now proceed to the next step.\n========================================\033[0m\n'

tei-service Kubernetes পরিষেবাটি পরীক্ষা করুন:

kubectl get service tei-service

প্রত্যাশিত আউটপুট:

student@cloudshell$ kubectl get service tei-service
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
tei-service   ClusterIP   34.118.233.48   <none>        8080/TCP   10m

CLUSTER-IP পরিষেবাটি অভ্যন্তরীণভাবে http://34.118.233.48:8080/embed ঠিকানায় অনুরোধগুলি পরিবেশন করে।

kubectl port-forward ব্যবহার করে মডেল এন্ডপয়েন্টটি স্থানীয়ভাবে পরীক্ষা করুন:

kubectl port-forward service/tei-service 8080:8080

টার্মিনালের উপরে থাকা + চিহ্নে ক্লিক করে দ্বিতীয় একটি ক্লাউড শেল ট্যাব খুলুন:

ক্লাউড শেল ট্যাব যোগ করুন

নতুন ট্যাবে, curl ব্যবহার করে এমবেডিং জেনারেশন পরীক্ষা করুন:

curl http://localhost:8080/embed \
  -X POST \
  -d '{"inputs":"Test"}' \
  -H 'Content-Type: application/json'

প্রত্যাশিত আউটপুট (ভেক্টর অ্যারে):

curl http://localhost:8080/embed \
>     -X POST \
>     -d '{"inputs":"Test"}' \
>     -H 'Content-Type: application/json'
[[-0.018975832,0.0071419072,0.06347208,0.022992613,0.014205903
...
-0.03677433,0.01636146,0.06731572]]

প্রথম ট্যাবে পোর্ট-ফরোয়ার্ডিং বন্ধ করতে ctrl+c চাপুন।

৬. AlloyDB Omni-তে এমবেডিং মডেলটি নিবন্ধন করুন।

AlloyDB Omni থেকে ডেপ্লয় করা মডেলটি ব্যবহার করতে, একটি ডাটাবেস তৈরি করুন, ট্রান্সফর্ম ফাংশনগুলো সংজ্ঞায়িত করুন এবং মডেল এন্ডপয়েন্টটি রেজিস্টার করুন।

একটি ক্লায়েন্ট ভিএম এবং ডাটাবেস তৈরি করুন

ক্লায়েন্ট জাম্প হোস্ট হিসেবে কাজ করার জন্য একই VPC-তে একটি Compute Engine VM ইনস্ট্যান্স তৈরি করুন:

ক্লায়েন্ট ভিএম এবং অ্যালয়ডিবি ওমনি দেখানো নেটওয়ার্ক আর্কিটেকচার ডায়াগ্রাম

ক্লাউড শেলে ক্লায়েন্ট ভিএম তৈরি করুন:

export ZONE=us-central1-a
gcloud compute instances create instance-1 \
  --zone=$ZONE

AlloyDB Omni এন্ডপয়েন্ট IP পুনরুদ্ধার করুন:

echo "INSTANCE_IP=$(kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default -o jsonpath='{.status.primary.endpoint}')"

প্রত্যাশিত আউটপুট:

INSTANCE_IP=10.128.0.33

INSTANCE_IP ভ্যালুটি হলো AlloyDB Omni ক্লাস্টারের অভ্যন্তরীণ লোড ব্যালান্সারের আইপি। এই উদাহরণে এটি হলো 10.131.0.33

SSH ব্যবহার করে VM ইনস্ট্যান্সে সংযোগ করুন:

gcloud compute ssh instance-1 --zone=$ZONE

instance-1 এর SSH সেশনে PostgreSQL ক্লায়েন্টটি ইনস্টল করুন:

sudo apt-get update && sudo apt-get install --yes postgresql-client 

AlloyDB Omni লোড ব্যালেন্সারের IP এক্সপোর্ট করুন (আপনার PRIMARYENDPOINT IP দিয়ে প্রতিস্থাপন করুন):

export INSTANCE_IP=10.131.0.33

psql ব্যবহার করে AlloyDB Omni-এর সাথে সংযোগ করুন (পাসওয়ার্ডটি হলো VeryStrongPassword ):

psql "host=$INSTANCE_IP user=postgres sslmode=require"

psql সেশনে, demo ডাটাবেসটি তৈরি করুন:

CREATE DATABASE demo;

demo ডেটাবেসে যান:

\c demo

রূপান্তর ফাংশন তৈরি করুন

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

ইনপুট ট্রান্সফর্ম ফাংশনটি তৈরি করুন:

CREATE OR REPLACE FUNCTION tei_text_input_transform(model_id VARCHAR(100), input_text TEXT)
RETURNS JSON
LANGUAGE plpgsql
AS $$
DECLARE
  transformed_input JSON;
BEGIN
  SELECT json_build_object('inputs', input_text, 'truncate', true)::JSON INTO transformed_input;
  RETURN transformed_input;
END;
$$;

প্রত্যাশিত আউটপুট:

demo=# CREATE OR REPLACE FUNCTION tei_text_input_transform(model_id VARCHAR(100), input_text TEXT)
RETURNS JSON
LANGUAGE plpgsql
AS $$
DECLARE
  transformed_input JSON;
BEGIN
  SELECT json_build_object('inputs', input_text, 'truncate', true)::JSON INTO transformed_input;
  RETURN transformed_input;
END;
$$;
CREATE FUNCTION
demo=#

ভেক্টর অ্যারে রেসপন্সটি পার্স করার জন্য আউটপুট ট্রান্সফর্ম ফাংশনটি তৈরি করুন:

CREATE OR REPLACE FUNCTION tei_text_output_transform(model_id VARCHAR(100), response_json JSON)
RETURNS REAL[]
LANGUAGE plpgsql
AS $$
DECLARE
  transformed_output REAL[];
BEGIN
  SELECT ARRAY(SELECT json_array_elements_text(response_json->0)) INTO transformed_output;
  RETURN transformed_output;
END;
$$;

প্রত্যাশিত আউটপুট:

demo=# CREATE OR REPLACE FUNCTION tei_text_output_transform(model_id VARCHAR(100), response_json JSON)
RETURNS REAL[]
LANGUAGE plpgsql
AS $$
DECLARE
  transformed_output REAL[];
BEGIN
  SELECT ARRAY(SELECT json_array_elements_text(response_json->0)) INTO transformed_output;
  RETURN transformed_output;
END;
$$;
CREATE FUNCTION
demo=#

মডেলটি নিবন্ধন করুন

google_ml.create_model প্রসিডিউরটি ব্যবহার করে AlloyDB Omni-তে মডেলটি রেজিস্টার করুন। Kubernetes ক্লাস্টার সার্ভিসে রিকোয়েস্ট রাউট করার জন্য model_request_url হিসেবে http://tei-service:8080/embed উল্লেখ করুন:

CALL
  google_ml.create_model(
    model_id => 'embeddinggemma',
    model_request_url => 'http://tei-service:8080/embed',
    model_provider => 'custom',
    model_type => 'text_embedding',
    model_in_transform_fn => 'tei_text_input_transform',
    model_out_transform_fn => 'tei_text_output_transform');

প্রত্যাশিত আউটপুট:

demo=# CALL
  google_ml.create_model(
    model_id => 'embeddinggemma',
    model_request_url => 'http://tei-service:8080/embed',
    model_provider => 'custom',
    model_type => 'text_embedding',
    model_in_transform_fn => 'tei_text_input_transform',
    model_out_transform_fn => 'tei_text_output_transform');
CALL
demo=#

একটি নমুনা SQL কোয়েরি দিয়ে নিবন্ধিত মডেলটি পরীক্ষা করুন:

SELECT google_ml.embedding('embeddinggemma', 'What is AlloyDB Omni?');

এই ফাংশনটি GKE-তে চলমান স্থানীয় EmbeddingGemma মডেল দ্বারা তৈরি বাস্তব সংখ্যার অ্যারে উপস্থাপনাটি ফেরত দেয়।

psql সেশন প্রম্পটে ফিরে যেতে q চাপুন।

psql সেশন থেকে প্রস্থান করুন:

\q

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

নমুনা ডেটা লোড করুন

এই টিউটোরিয়ালে ভেক্টর সিমিলারিটি সার্চ দেখানোর জন্য সিম্বাল রিটেইল ডেটাসেট ব্যবহার করা হয়েছে। আপনি অ্যালয়ডিবি অমনি-তে ডেটা ইম্পোর্ট করার জন্য গুগল ক্লাউড এসডিকে এবং পোস্টগ্রেসকিউএল ক্লায়েন্ট ব্যবহার করবেন।

instance-1 এর SSH সেশনে ডেমো ডেটাবেসে সংযোগ করুন এবং vector এক্সটেনশনটি সক্রিয় করুন:

psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"

psql সেশনে:

CREATE EXTENSION IF NOT EXISTS vector;

psql সেশন থেকে প্রস্থান করুন:

\q

demo ডেটাবেসে টেবিল তৈরি করতে স্কিমাটি ডাউনলোড ও প্রয়োগ করুন:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=demo"

প্রত্যাশিত আউটপুট:

student@cloudshell:~$ gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=demo"
Password for user postgres:
SET
SET
SET
SET
SET
 set_config
------------

(1 row)

SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER TABLE
ALTER SEQUENCE
ALTER TABLE
ALTER TABLE
ALTER TABLE
student@cloudshell:~$

তৈরি করা টেবিলগুলো যাচাই করুন:

psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\dt+"

প্রত্যাশিত আউটপুট:

student@cloudshell:~$ psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\dt+"
Password for user postgres: 
                                           List of relations
 Schema |       Name       | Type  |  Owner   | Persistence | Access method |    Size    | Description 
--------+------------------+-------+----------+-------------+---------------+------------+-------------
 public | cymbal_embedding | table | postgres | permanent   | heap          | 8192 bytes | 
 public | cymbal_inventory | table | postgres | permanent   | heap          | 8192 bytes | 
 public | cymbal_products  | table | postgres | permanent   | heap          | 8192 bytes | 
 public | cymbal_stores    | table | postgres | permanent   | heap          | 8192 bytes | 
(4 rows)

cymbal_products টেবিলে ডেটা লোড করুন:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_products from stdin csv header"

প্রত্যাশিত আউটপুট:

student@cloudshell:~$ gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_products from stdin csv header"
COPY 941
student@cloudshell:~$ 

এখানে cymbal_products টেবিলের কয়েকটি সারির একটি নমুনা দেওয়া হলো।

psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT uniq_id,left(product_name,30),left(product_description,50),sale_price FROM cymbal_products limit 3"

প্রত্যাশিত আউটপুট:

student@cloudshell:~$ psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT uniq_id,left(product_name,30),left(product_description,50),sale_price FROM cymbal_products limit 3"
Password for user postgres: 
             uniq_id              |              left              |                        left                        | sale_price 
----------------------------------+--------------------------------+----------------------------------------------------+------------
 a73d5f754f225ecb9fdc64232a57bc37 | Laundry Tub Strainer Cup       |   Laundry tub strainer cup Chrome For 1-.50, drain |      11.74
 41b8993891aa7d39352f092ace8f3a86 | LED Starry Star Night Light La |  LED Starry Star Night Light Laser Projector 3D Oc |      46.97
 ed4a5c1b02990a1bebec908d416fe801 | Surya Horizon HRZ-1060 Area Ru |  The 100% polypropylene construction of the Surya  |       77.4
(3 rows)
student@cloudshell:~$ 

cymbal_inventory টেবিলে ডেটা লোড করুন:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_inventory from stdin csv header"

প্রত্যাশিত আউটপুট:

student@cloudshell:~$ gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_inventory from stdin csv header"
Password for user postgres: 
COPY 263861
student@cloudshell:~$ 

এখানে cymbal_inventory টেবিলের কয়েকটি সারির একটি নমুনা দেওয়া হলো।

psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT * FROM cymbal_inventory LIMIT 3"

আউটপুট:

student@cloudshell:~$ psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT * FROM cymbal_inventory LIMIT 3"
Password for user postgres: 
 store_id |             uniq_id              | inventory 
----------+----------------------------------+-----------
     1583 | adc4964a6138d1148b1d98c557546695 |         5
     1490 | adc4964a6138d1148b1d98c557546695 |         4
     1492 | adc4964a6138d1148b1d98c557546695 |         3
(3 rows)
student@cloudshell:~$ 

cymbal_stores টেবিলে ডেটা লোড করুন:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_stores from stdin csv header"

প্রত্যাশিত কনসোল আউটপুট:

student@cloudshell:~$ gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_stores from stdin csv header"
Password for user postgres: 
COPY 4654
student@cloudshell:~$

এখানে cymbal_stores টেবিলের কয়েকটি সারির একটি নমুনা দেওয়া হলো।

psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT store_id, name, zip_code FROM cymbal_stores limit 3"

আউটপুট:

student@cloudshell:~$ psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT store_id, name, zip_code FROM cymbal_stores limit 3"
Password for user postgres: 
 store_id |       name        | zip_code 
----------+-------------------+----------
     1990 | Mayaguez Store    |      680
     2267 | Ware Supercenter  |     1082
     4359 | Ponce Supercenter |      780
(3 rows)
student@cloudshell:~$ 

এমবেডিং তৈরি করুন

psql ব্যবহার করে ডেমো ডেটাবেসে সংযোগ স্থাপন করুন এবং পণ্যের বিবরণের উপর ভিত্তি করে cymbal_products টেবিলে বর্ণিত পণ্যগুলির জন্য এমবেডিং তৈরি করুন।

ডেমো ডাটাবেসে সংযোগ করুন:

psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"

পণ্যের বিবরণের জন্য তৈরি করা টেক্সট এমবেডিংগুলো সংরক্ষণ করতে vector টাইপের embedding কলামটি ব্যবহার করুন।

কোয়েরি টাইমিং সক্ষম করুন:

\timing

প্রতিটি পণ্যের বিবরণের জন্য এমবেডিং তৈরি করুন এবং সেগুলোকে cymbal_embedding টেবিলে সংরক্ষণ করুন:

INSERT INTO cymbal_embedding (uniq_id, embedding)
SELECT uniq_id, google_ml.embedding('embeddinggemma', product_description)::vector
FROM cymbal_products;

প্রত্যাশিত আউটপুট:

demo=# INSERT INTO cymbal_embedding(uniq_id,embedding)  SELECT uniq_id, google_ml.embedding('embeddinggemma',product_description)::vector FROM cymbal_products;
INSERT 0 941
Time: 497878.136 ms (08:17.878)
demo=#

শব্দার্থিক অনুসন্ধান কোয়েরি চালান

psql সেশনে, কোসাইন ডিসটেন্স ( <=> ) ব্যবহার করে "What kind of fruit trees grow well here?" প্রশ্নটির সাথে মেলে এমন শীর্ষ পাঁচটি পণ্য খুঁজুন:

SELECT
    cp.product_name,
    left(cp.product_description, 80) AS description,
    cp.sale_price,
    cs.zip_code,
    (ce.embedding <=> google_ml.embedding('embeddinggemma', 'What kind of fruit trees grow well here?')::vector) AS distance
FROM
    cymbal_products cp
JOIN cymbal_embedding ce ON ce.uniq_id = cp.uniq_id
JOIN cymbal_inventory ci ON ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON cs.store_id = ci.store_id
WHERE
    ci.inventory > 0
    AND cs.store_id = 1583
ORDER BY
    distance ASC
LIMIT 5;

প্রত্যাশিত আউটপুট:

demo=# SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (ce.embedding <=> google_ml.embedding('embeddinggemma','What kind of fruit trees grow well here?')::vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_embedding ce on ce.uniq_id=cp.uniq_id
JOIN cymbal_inventory ci on ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on cs.store_id=ci.store_id
WHERE
    ci.inventory > 0
    AND cs.store_id = 1583
ORDER BY
    distance ASC
LIMIT 5;
     product_name      |                                   description                                    | sale_price | zip_code |      distance
-----------------------+----------------------------------------------------------------------------------+------------+----------+--------------------
 Cherry Tree           | This is a beautiful cherry tree that will produce delicious cherries. It is an d |      75.00 |    93230 | 0.5210549378080666
 California Lilac      | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d |       5.00 |    93230 | 0.5639421771781971
 Toyon                 | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 | 0.5670010914504852
 Rose Bush             | This is a beautiful rose bush that will produce fragrant roses. It is a perennia |      50.00 |    93230 | 0.5731542622882957
 California Peppertree | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e |      25.00 |    93230 | 0.5750934653011995
(5 rows)

Time: 83.610 ms
demo=#

কোয়েরিটি ৮৩ মিলিসেকেন্ড সময় নিয়ে চলেছে এবং cymbal_products টেবিল থেকে অনুরোধের সাথে মিলে যাওয়া ও দোকানে ১৫৮৩ নম্বর হিসেবে মজুত থাকা গাছগুলোর একটি তালিকা ফেরত দিয়েছে।

ANN সূচক তৈরি করুন

ছোট ডেটা সেটের ক্ষেত্রে সমস্ত এমবেডিং স্ক্যান করে এক্সাক্ট সার্চ ব্যবহার করা সহজ, কিন্তু ডেটার পরিমাণ বাড়লে লোড এবং রেসপন্স টাইমও বেড়ে যায়। পারফরম্যান্স উন্নত করার জন্য আপনি আপনার এমবেডিং ডেটার উপর ইনডেক্স তৈরি করতে পারেন। ভেক্টর ডেটার জন্য গুগল স্ক্যান (Google ScaNN) ইনডেক্স ব্যবহার করে এটি কীভাবে করতে হয় তার একটি উদাহরণ এখানে দেওয়া হলো।

সংযোগ বিচ্ছিন্ন হয়ে গেলে ডেমো ডেটাবেসে পুনরায় সংযোগ করুন:

psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"

alloydb_scann এক্সটেনশনটি সক্রিয় করুন:

CREATE EXTENSION IF NOT EXISTS alloydb_scann;

embedding কলামে ScaNN ইনডেক্স তৈরি করুন:

CREATE INDEX cymbal_products_embeddings_scann ON cymbal_embedding
  USING scann (embedding cosine)
  WITH (num_leaves=10, max_num_levels = 1);

এক্সিকিউশন পারফরম্যান্স তুলনা করতে সিমান্টিক সার্চ কোয়েরিটি পুনরায় চালান:

SELECT
    cp.product_name,
    left(cp.product_description, 80) AS description,
    cp.sale_price,
    cs.zip_code,
    (ce.embedding <=> google_ml.embedding('embeddinggemma', 'What kind of fruit trees grow well here?')::vector) AS distance
FROM
    cymbal_products cp
JOIN cymbal_embedding ce ON ce.uniq_id = cp.uniq_id
JOIN cymbal_inventory ci ON ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON cs.store_id = ci.store_id
WHERE
    ci.inventory > 0
    AND cs.store_id = 1583
ORDER BY
    distance ASC
LIMIT 5;

প্রত্যাশিত আউটপুট:

demo=# SELECT
    cp.product_name,
    left(cp.product_description,80) as description,
    cp.sale_price,
    cs.zip_code,
    (ce.embedding <=> google_ml.embedding('embeddinggemma', 'What kind of fruit trees grow well here?')::vector) AS distance
FROM
    cymbal_products cp
JOIN cymbal_embedding ce ON ce.uniq_id = cp.uniq_id
JOIN cymbal_inventory ci ON ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON cs.store_id = ci.store_id
WHERE
    ci.inventory > 0
    AND cs.store_id = 1583
ORDER BY
    distance ASC
LIMIT 5;
     product_name      |                                   description                                    | sale_price | zip_code |      distance
-----------------------+----------------------------------------------------------------------------------+------------+----------+--------------------
 Cherry Tree           | This is a beautiful cherry tree that will produce delicious cherries. It is an d |      75.00 |    93230 | 0.5210549378080666
 California Lilac      | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d |       5.00 |    93230 | 0.5639421771781971
 Toyon                 | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 | 0.5670010914504852
 Rose Bush             | This is a beautiful rose bush that will produce fragrant roses. It is a perennia |      50.00 |    93230 | 0.5731542622882957
 California Peppertree | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e |      25.00 |    93230 | 0.5750934653011995
(5 rows)

Time: 64.783 ms

কোয়েরি সম্পাদনের সময় সামান্য কমেছে এবং বড় ডেটাসেটের ক্ষেত্রে এই সুবিধা আরও বেশি লক্ষণীয় হবে। ফেরত আসা ডেটা ইনডেক্স ছাড়া প্রাপ্ত ডেটার সমান বা খুব কাছাকাছি হওয়া উচিত।

অন্যান্য কোয়েরি ব্যবহার করে দেখুন এবং ডকুমেন্টেশনে ভেক্টর ইনডেক্স অপ্টিমাইজ করার বিষয়ে আরও পড়ুন।

psql সেশন থেকে প্রস্থান করুন:

\q

CTRL+D চেপে অথবা exit টাইপ করে instance-1 ssh সেশন থেকে সংযোগ বিচ্ছিন্ন করে Google Cloud Shell-এ ফিরে যান।

৮. vLLM দিয়ে Gemma স্থাপন করুন

জেমার জন্য নোড পুল যোগ করুন

প্রথমে, আপনার অঞ্চলে কোন ধরনের নোড উপলব্ধ আছে তা যাচাই করে নিন:

export LOCATION=us-central1-a
gcloud compute accelerator-types list --filter="zone:${LOCATION}"

আপনি nvidia-l4 অ্যাক্সেলারেটর সহ উপলব্ধ অ্যাক্সেলারেটর প্রকারের একটি তালিকা দেখতে পাবেন। এখন nvidia-l4 অ্যাক্সেলারেটর প্রকার ব্যবহার করে একটি নোড পুল তৈরি করুন:

export PROJECT_ID=$(gcloud config get project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
gcloud container node-pools create gpupool \
    --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \
    --project=${PROJECT_ID} \
    --location=${LOCATION} \
    --node-locations=${LOCATION}-a \
    --cluster=${CLUSTER_NAME} \
    --machine-type=g2-standard-8 \
    --num-nodes=1

vLLM ব্যবহার করে Google Gemini 4 12B মডেলের জন্য একটি ডেপ্লয়মেন্ট ম্যানিফেস্ট তৈরি করুন:

cat << 'EOF' > gemma-12b-gpu-vllm-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gemma-12b-gpu-vllm-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gemma-12b-gpu-vllm
  template:
    metadata:
      labels:
        app: gemma-12b-gpu-vllm
        ai.gke.io/model: gemma-4-12b-it
        ai.gke.io/inference-server: vllm
        examples.ai.gke.io/source: user-guide
    spec:
      containers:
      - name: inference-server
        image: us-docker.pkg.dev/vertex-ai/vertex-vision-model-garden-dockers/pytorch-vllm-serve:latest
        resources:
          requests:
            cpu: "4"
            memory: "16Gi"
            ephemeral-storage: "30Gi"
            nvidia.com/gpu: "1"
          limits:
            cpu: "8"
            memory: "24Gi"
            ephemeral-storage: "30Gi"
            nvidia.com/gpu: "1"
        command: ["python3", "-m", "vllm.entrypoints.api_server"]
        args:
          - --model=$(MODEL_ID)
          - --host=0.0.0.0
          - --port=8000
          - --tensor-parallel-size=1
          - --enable-log-requests
          - --enable-chunked-prefill
          - --enable-prefix-caching
          - --enable-auto-tool-choice
          - --generation-config=auto
          - --tool-call-parser=gemma4
          - --dtype=bfloat16
          - --max-num-seqs=16
          - --max-model-len=32768
          - --gpu-memory-utilization=0.95
          - --reasoning-parser=gemma4
          - --trust-remote-code
          - --quantization=fp8
        env:
        - name: LD_LIBRARY_PATH
          value: ${LD_LIBRARY_PATH}:/usr/local/nvidia/lib64
        - name: MODEL_ID
          value: google/gemma-4-12b-it
        - name: HF_TOKEN
          valueFrom:
            secretKeyRef:
              name: hf-secret
              key: hf_api_token
        volumeMounts:
        - mountPath: /dev/shm
          name: dshm
      volumes:
      - name: dshm
        emptyDir:
            medium: Memory
      nodeSelector:
        cloud.google.com/gke-accelerator: nvidia-l4
        cloud.google.com/gke-gpu-driver-version: latest
---
apiVersion: v1
kind: Service
metadata:
  name: gemma-12b-gpu-vllm-service
spec:
  selector:
    app: gemma-12b-gpu-vllm
  type: ClusterIP
  ports:
    - protocol: TCP
      port: 8000
      targetPort: 8000
EOF

সংরক্ষিত gemma-12b-gpu-vllm-deployment.yaml ডিপ্লয়মেন্টটি প্রয়োগ করুন:

kubectl apply -f gemma-12b-gpu-vllm-deployment.yaml

প্রত্যাশিত আউটপুট:

$ kubectl apply -f gemma-12b-gpu-vllm-deployment.yaml
deployment.apps/gemma-12b-gpu-vllm-deployment created
service/gemma-12b-gpu-vllm-service created

ডেপ্লয়মেন্ট সম্পূর্ণ হওয়া এবং মডেলটি লোড হওয়া পর্যন্ত অপেক্ষা করুন। এতে কয়েক মিনিট সময় লাগতে পারে।

printf "Waiting for model to load..."; until kubectl logs -l app=gemma-12b-gpu-vllm --tail=50 2>/dev/null | grep -q "Application startup complete"; do printf "."; sleep 3; done; printf '\n\033[1;32m========================================\n[SUCCESS] Model is loaded and ready!\nYou can now proceed to the next step.\n========================================\033[0m\n'

প্রত্যাশিত আউটপুট:

Waiting for model to load...
========================================
[SUCCESS] Model is loaded and ready!
You can now proceed to the next step.
========================================

মডেলটি পরীক্ষা করুন। মডেলটি অ্যাক্সেস করার জন্য পোর্ট ফরওয়ার্ডিং সক্রিয় করুন:

kubectl port-forward svc/gemma-12b-gpu-vllm-service 8090:8000

অন্য একটি টার্মিনাল উইন্ডোতে, মডেলটিতে একটি প্রম্পট পাঠাতে `curl` ব্যবহার করুন:

curl http://localhost:8090/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [
      {"role": "system", "content": "You are a helpful assistant running on GKE."},
      {"role": "user", "content": "What is AlloyDB Omni."}
    ],
    "temperature": 0.7
  }' | jq -r '.choices[0].message.content'

প্রত্যাশিত আউটপুট:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3957  100  3761  100   196     85      4  0:00:49  0:00:43  0:00:06   830
**AlloyDB Omni** is a fully managed, PostgreSQL-compatible database engine from Google Cloud that can be run **on-premises, in other clouds, or in your own data centers.**

To understand it simply: It allows you to run the high-performance, enterprise-grade capabilities of Google's **AlloyDB** (a cloud-native database) on your own infrastructure.

Here is a breakdown of what makes it significant:

### 1. The "Best of Both Worlds" Architecture
Normally, you have to choose between:
*   **Managed Cloud Databases:** Easy to scale and manage, but you are locked into the cloud provider's infrastructure.
*   **Self-Managed Databases:** You have full control over the hardware/location, but you are responsible for scaling, patching, and high availability.

**AlloyDB Omni** bridges this gap. It provides the advanced features of a cloud-native database (like intelligent indexing, high availability, and massive scalability) while allowing you to run it anywhere.

প্রথম টার্মিনালে পোর্ট ফরওয়ার্ডিং চালু থাকলে, Ctrl+C চেপে তা বন্ধ করুন।

৯. AlloyDB Omni-তে Gemma 4 মডেল নিবন্ধন করুন

google_ml.create_model প্রসিডিউরটি ব্যবহার করে AlloyDB Omni-তে Gemma 12B মডেলটি রেজিস্টার করুন। Kubernetes ক্লাস্টার সার্ভিসে রিকোয়েস্ট রাউট করার জন্য model_request_url হিসেবে http://gemma-12b-gpu-vllm-service:8000/v1/chat/completions উল্লেখ করুন:

AlloyDB Omni এন্ডপয়েন্ট IP পুনরুদ্ধার করুন:

echo "INSTANCE_IP=$(kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default -o jsonpath='{.status.primary.endpoint}')"

SSH ব্যবহার করে VM ইনস্ট্যান্সে সংযোগ করুন:

export ZONE=us-central1-a
gcloud compute ssh instance-1 --zone=$ZONE

VM-এ সংযোগ করার পর পূর্ববর্তী ধাপ থেকে INSTANCE_IP ভেরিয়েবলটি এক্সপোর্ট করুন (এখানে 10.128.0.33 মানটি উদাহরণ হিসেবে দেওয়া হয়েছে - এটিকে আপনার IP দিয়ে প্রতিস্থাপন করুন):

export INSTANCE_IP=10.128.0.33

AlloyDB পাসওয়ার্ড রপ্তানি করুন:

export PGPASSWORD=VeryStrongPassword

demo ডাটাবেসে সংযোগ করুন:

psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"

psql সেশনে মডেলটি রেজিস্টার করুন:

CALL
  google_ml.create_model(
    model_id => 'gemma-12b-gpu',
    model_request_url => 'http://gemma-12b-gpu-vllm-service:8000/v1/chat/completions',
    model_provider => 'custom',
    model_type => 'llm');

একটি নমুনা SQL কোয়েরি দিয়ে মডেলটি পরীক্ষা করুন:

SELECT google_ml.predict_row(
  model_id => 'gemma-12b-gpu',
  request_body => json_build_object(
    'messages', json_build_array(
      json_build_object('role', 'user', 'content', 'What is AlloyDB Omni?'))))->'choices'->0->'message'->'content';

ফলাফল উইন্ডো থেকে বেরিয়ে psql প্রম্পটে ফিরে যেতে q চাপুন।

AlloyDB Omni-তে ভেক্টর সার্চকে LLM RAG-এর সাথে একত্রিত করুন

LLM-এর সাথে RAG (Retrieval-Augmented Generation) প্রদর্শন করতে LLM অনুরোধের সাথে ভেক্টর অনুসন্ধান ব্যবহার করুন।

plsql-এ SQL কোয়েরিটি চালান:

WITH trees AS (
SELECT
        cp.product_name,
        cp.product_description AS description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id AS product_id
FROM
    cymbal_products cp
JOIN cymbal_embedding ce ON ce.uniq_id = cp.uniq_id
JOIN cymbal_inventory ci ON ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON cs.store_id = ci.store_id
WHERE
        ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (ce.embedding <=> embedding('embeddinggemma',
        'What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1),
prompt AS (
SELECT
        'You are a friendly advisor helping to find a product based on the customer''s needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","product_description":"some description","sale_price":10}
Here is the list of products:' || json_agg(trees) || 'The customer asked "What kind of fruit trees grow well here?"
You should give information about the product, price and some supplemental information' AS prompt_text
FROM
        trees),
response AS (
SELECT
        google_ml.predict_row(
          model_id =>'gemma-12b-gpu',
          request_body => json_build_object(
            'messages', json_build_array(
              json_build_object('role', 'user', 'content',prompt_text)
            )))->'choices'->0->'message'->'content' AS resp
FROM
        prompt)
SELECT
REPLACE(resp::text, '\n', CHR(10))
FROM
        response;

প্রত্যাশিত আউটপুট:

----------------------------------------------------------------------------------------------------------------------------------------------
 "Hello there! I'd be happy to help you find the perfect tree for your garden.                                                               +
                                                                                                                                             +
 Based on your location, we have a wonderful option that would grow beautifully in your area:                                                +
                                                                                                                                             +
 **Cherry Tree**                                                                                                                             +
 *   **Price:** $75.00                                                                                                                       +
 *   **Description:** This is a stunning deciduous tree that not only provides a beautiful landscape but also produces delicious cherries.   +
 *   **Supplemental Information:**                                                                                                           +
     *   **Growth:** It grows to about 15 feet tall.                                                                                         +
     *   **Appearance:** You can look forward to dark green leaves in the summer that transform into a vibrant red in the fall.              +
     *   **Benefits:** It's a great choice if you're looking for both fruit and extra shade or privacy in your yard.                         +
     *   **Care Tips:** It performs best in a cool, moist climate with sandy soil. Since you are in a suitable zone, it should thrive nicely!+
                                                                                                                                             +
 Would you like more details on how to plant this, or would you like to proceed with an order?"
(1 row)

কোয়েরিটি ভেক্টর সার্চের ফলাফলের মাধ্যমে LLM-এর প্রম্পটকে পরিপূরণ করে।

অন্যান্য কোয়েরি ব্যবহার করে দেখুন এবং RAG প্যাটার্নগুলো নিয়ে পরীক্ষা-নিরীক্ষা করুন। উপস্থাপিত আর্কিটেকচারটির সুবিধা হলো এর সম্পূর্ণ স্বনির্ভরতা। ডেটা আপনার ক্লাস্টারের বাইরে পাঠানো হয় না এবং এটি সম্পূর্ণ বিচ্ছিন্ন পরিবেশে চলতে পারে।

psql সেশন থেকে প্রস্থান করুন:

\q

ভিএম-এর SSH সেশন থেকে সংযোগ বিচ্ছিন্ন করুন:

exit

ভুলে যাবেন না যে AlloyDB Omni-তে আরও বেশি ফিচার ও ল্যাব রয়েছে।

১০. পরিবেশ পরিষ্কার করা

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

GKE ক্লাস্টারটি মুছে ফেলুন

ক্লাউড শেলে, GKE ক্লাস্টারটি মুছে ফেলুন:

export PROJECT_ID=$(gcloud config get-value project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
gcloud container clusters delete ${CLUSTER_NAME} \
  --project=${PROJECT_ID} \
  --region=${LOCATION}

প্রত্যাশিত আউটপুট:

student@cloudshell:~$ gcloud container clusters delete ${CLUSTER_NAME} \
>   --project=${PROJECT_ID} \
>   --region=${LOCATION}
The following clusters will be deleted.
 - [alloydb-ai-gke] in [us-central1]

Do you want to continue (Y/n)?  Y

Deleting cluster alloydb-ai-gke...done.
Deleted

ক্লায়েন্ট ভিএমটি মুছে ফেলুন

ক্লাউড শেলে, কম্পিউট ইঞ্জিন ইনস্ট্যান্সটি ডিলিট করুন:

export PROJECT_ID=$(gcloud config get-value project)
export ZONE=us-central1-a
gcloud compute instances delete instance-1 \
  --project=${PROJECT_ID} \
  --zone=${ZONE}

প্রত্যাশিত আউটপুট:

student@cloudshell:~$ export PROJECT_ID=$(gcloud config get project)
export ZONE=us-central1-a
gcloud compute instances delete instance-1 \
  --project=${PROJECT_ID} \
  --zone=${ZONE}
Your active configuration is: [cloudshell-5399]
The following instances will be deleted. Any attached disks configured to be auto-deleted will be deleted unless they are attached to any other instances or the `--keep-disks` flag is given and specifies them for keeping. Deleting a disk 
is irreversible and any data on the disk will be lost.
 - [instance-1] in [us-central1-a]

Do you want to continue (Y/n)?  Y

Deleted

আপনি যদি এই কোডল্যাবের জন্য একটি নতুন প্রজেক্ট তৈরি করে থাকেন, তাহলে আপনি চাইলে গুগল ক্লাউড রিসোর্স ম্যানেজার থেকে সম্পূর্ণ প্রজেক্টটি মুছে ফেলতে পারেন।

১১. অভিনন্দন

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

আপনি যা কভার করেছেন

  • একটি GKE ক্লাস্টারে AlloyDB Omni কীভাবে স্থাপন করবেন
  • AlloyDB Omni-এর সাথে কীভাবে সংযোগ করবেন
  • AlloyDB Omni-তে কীভাবে ডেটা লোড করবেন
  • GKE-তে AI মডেল (এম্বেডিং এবং LLM) কীভাবে স্থাপন করবেন
  • AlloyDB Omni-তে AI মডেলগুলি কীভাবে নিবন্ধন করবেন
  • সিমান্টিক সার্চের জন্য এমবেডিং কীভাবে তৈরি করবেন
  • AlloyDB Omni-তে কীভাবে সিমান্টিক সার্চ কোয়েরি চালাবেন
  • AlloyDB Omni-তে ভেক্টর ইনডেক্স কীভাবে তৈরি এবং ব্যবহার করবেন

AlloyDB Omni-তে AI নিয়ে কাজ করার বিষয়ে আপনি ডকুমেন্টেশন থেকে আরও জানতে পারবেন।

জরিপ

আউটপুট:

আপনি এই টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন?

শুধু একবার পড়ে দেখুন এটি পড়ুন এবং অনুশীলনগুলো সম্পূর্ণ করুন।