কুবারনেটসে অ্যালয়ডিবি ওমনি এবং এম্বেডিংগেমা।

1. ভূমিকা

এই কোডল্যাবে আপনি শিখবেন কিভাবে GKE তে AlloyDB Omni স্থাপন করতে হয় এবং একই Kubernetes ক্লাস্টারে স্থাপন করা একটি ওপেন এম্বেডিং মডেলের সাথে এটি ব্যবহার করতে হয়। একই GKE ক্লাস্টারে ডাটাবেস ইনস্ট্যান্সের পাশে একটি মডেল স্থাপন করলে লেটেন্সি এবং তৃতীয় পক্ষের পরিষেবার উপর নির্ভরতা হ্রাস পায়। এছাড়াও, যখন ডেটা প্রতিষ্ঠানের বাইরে না যায় এবং তৃতীয় পক্ষের পরিষেবা ব্যবহারের অনুমতি না থাকে তখন স্থানীয় স্থাপনা নিরাপত্তা এবং সম্মতি দ্বারা নির্ধারিত একটি প্রয়োজনীয়তা হতে পারে।

6a0381e6e4a8d7f8.png সম্পর্কে

পূর্বশর্ত

  • গুগল ক্লাউড, কনসোল সম্পর্কে প্রাথমিক ধারণা
  • কুবারনেটস এবং জিকেই সম্পর্কে প্রাথমিক জ্ঞান
  • কমান্ড লাইন ইন্টারফেস এবং ক্লাউড শেলের মৌলিক দক্ষতা।

তুমি কি শিখবে

  • গুগল কুবারনেটস ক্লাস্টারে অ্যালয়ডিবি ওমনি কীভাবে স্থাপন করবেন
  • AlloyDB Omni-এর সাথে কীভাবে সংযোগ করবেন
  • AlloyDB Omni তে ডেটা কীভাবে লোড করবেন
  • GKE তে একটি ওপেন এম্বেডিং মডেল কীভাবে স্থাপন করবেন
  • AlloyDB Omni তে এমবেডিং মডেল কিভাবে নিবন্ধন করবেন
  • শব্দার্থিক অনুসন্ধানের জন্য এম্বেডিং কীভাবে তৈরি করবেন
  • AlloyDB Omni-তে শব্দার্থিক অনুসন্ধানের জন্য জেনারেট করা এম্বেডিং কীভাবে ব্যবহার করবেন
  • AlloyDB তে ভেক্টর ইনডেক্স কিভাবে তৈরি এবং ব্যবহার করবেন

তোমার যা লাগবে

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

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

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

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

কর্মক্ষেত্র বা স্কুল অ্যাকাউন্টের পরিবর্তে ব্যক্তিগত অ্যাকাউন্ট ব্যবহার করুন।

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

295004821bab6a87.png সম্পর্কে

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

37d264871000675d.png সম্পর্কে

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

96d86d3d5655cdbe.png সম্পর্কে

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

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

একটি ব্যক্তিগত বিলিং অ্যাকাউন্ট সেট আপ করুন

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

একটি ব্যক্তিগত বিলিং অ্যাকাউন্ট সেট আপ করতে, ক্লাউড কনসোলে বিলিং সক্ষম করতে এখানে যান

কিছু নোট:

  • এই ল্যাবটি সম্পূর্ণ করতে ক্লাউড রিসোর্সে $3 USD এর কম খরচ হবে।
  • আরও চার্জ এড়াতে আপনি এই ল্যাবের শেষে রিসোর্স মুছে ফেলার ধাপগুলি অনুসরণ করতে পারেন।
  • নতুন ব্যবহারকারীরা $300 USD বিনামূল্যে ট্রায়ালের জন্য যোগ্য।

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

যদিও গুগল ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালিত হতে পারে, এই কোডল্যাবে আপনি গুগল ক্লাউড শেল ব্যবহার করবেন, যা ক্লাউডে চলমান একটি কমান্ড লাইন পরিবেশ।

গুগল ক্লাউড কনসোল থেকে, উপরের ডানদিকের টুলবারে ক্লাউড শেল আইকনে ক্লিক করুন:

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

অথবা আপনি G তারপর S টিপতে পারেন। আপনি যদি Google Cloud Console-এর মধ্যে থাকেন অথবা এই লিঙ্কটি ব্যবহার করেন তবে এই ক্রমটি Cloud Shell সক্রিয় করবে।

পরিবেশের সাথে সংযোগ স্থাপন এবং সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগবে। এটি সম্পন্ন হলে, আপনি এরকম কিছু দেখতে পাবেন:

গুগল ক্লাউড শেল টার্মিনালের স্ক্রিনশট যা দেখায় যে পরিবেশটি সংযুক্ত হয়েছে

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

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

API সক্ষম করুন

আউটপুট:

AlloyDB Omni এবং ওপেন মডেল স্থাপনার জন্য Google Kubernetes Engine (GKE) ব্যবহার করতে, আপনার Google Cloud Project-এ তাদের নিজ নিজ API গুলি সক্ষম করতে হবে।

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

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

যদি এটি ক্লাউড শেল কনফিগারেশনে সংজ্ঞায়িত না থাকে তবে নিম্নলিখিত কমান্ড ব্যবহার করে এটি সেট আপ করুন

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

সমস্ত প্রয়োজনীয় পরিষেবা সক্ষম করুন:

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 গুলির সাথে পরিচয় করিয়ে দেওয়া হচ্ছে

  • Kubernetes Engine API ( container.googleapis.com ) আপনাকে Google Kubernetes Engine (GKE) ক্লাস্টার তৈরি এবং পরিচালনা করতে দেয়। এটি Google এর পরিকাঠামো ব্যবহার করে আপনার কন্টেইনারাইজড অ্যাপ্লিকেশনগুলি স্থাপন, পরিচালনা এবং স্কেল করার জন্য একটি পরিচালিত পরিবেশ প্রদান করে।
  • কম্পিউট ইঞ্জিন API ( compute.googleapis.com ) আপনাকে ভার্চুয়াল মেশিন (VM), স্থায়ী ডিস্ক এবং নেটওয়ার্ক সেটিংস তৈরি এবং পরিচালনা করতে দেয়। এটি আপনার কাজের চাপ চালানোর জন্য এবং অনেক পরিচালিত পরিষেবার জন্য অন্তর্নিহিত অবকাঠামো হোস্ট করার জন্য প্রয়োজনীয় মূল অবকাঠামো-অ্যাজ-এ-সার্ভিস (IaaS) ভিত্তি প্রদান করে।

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

GKE তে AlloyDB Omni স্থাপন করার জন্য আমাদের AlloyDB Omni অপারেটরের প্রয়োজনীয়তাগুলিতে তালিকাভুক্ত প্রয়োজনীয়তাগুলি অনুসরণ করে একটি Kubernetes ক্লাস্টার প্রস্তুত করতে হবে।

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

আমাদের একটি স্ট্যান্ডার্ড GKE ক্লাস্টার স্থাপন করতে হবে যার পুল কনফিগারেশন যথেষ্ট হবে যা AlloyDB Omni ইনস্ট্যান্স সহ একটি পড স্থাপনের জন্য যথেষ্ট। AlloyDB Omni এর জন্য আমাদের কমপক্ষে 2 CPU এবং 8 GB RAM প্রয়োজন এবং অপারেটর এবং মনিটরিং পরিষেবার কন্টেইনারের জন্য কিছু জায়গা থাকতে হবে। আমরা e2-standard-4 VM টাইপ ব্যবহার করতে যাচ্ছি।

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

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

তারপর আমরা GKE স্ট্যান্ডার্ড ক্লাস্টার তৈরি করতে gcloud ব্যবহার করি।

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:~ (gleb-test-short-001-415614)$ export PROJECT_ID=$(gcloud config get project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
export MACHINE_TYPE=n2-highmem-2
Your active configuration is: [gleb-test-short-001-415614]
student@cloudshell:~ (gleb-test-short-001-415614)$ 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: The Kubelet readonly port (10255) is now deprecated. Please update your workloads to use the recommended alternatives. See https://cloud.google.com/kubernetes-engine/docs/how-to/disable-kubelet-readonly-port for ways to check usage and for migration instructions.
Note: Your Pod address range (`--cluster-ipv4-cidr`) can accommodate at most 1008 node(s).
Creating cluster alloydb-ai-gke in us-central1..


NAME: omni01
ZONE: us-central1-a
MACHINE_TYPE: e2-standard-4
PREEMPTIBLE: 
INTERNAL_IP: 10.128.0.3
EXTERNAL_IP: 35.232.157.123
STATUS: RUNNING
student@cloudshell:~ (gleb-test-short-001-415614)$ 

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

আমাদের প্রয়োজনীয় উপাদানগুলি ইনস্টল করতে হবে যেমন cert-manager পরিষেবা - kubernetes এর জন্য নেটিভ সার্টিফিকেট ম্যানেজার। cert-manager ইনস্টলেশনের জন্য আমরা ডকুমেন্টেশনের ধাপগুলি অনুসরণ করতে পারি।

আমরা Kubernetes কমান্ড-লাইন টুল, kubectl ব্যবহার করি, যা ডিফল্টরূপে ক্লাউড শেলে ইতিমধ্যেই ইনস্টল করা আছে। ইউটিলিটি ব্যবহার করার আগে আমাদের ক্লাস্টারের জন্য শংসাপত্র পেতে হবে।

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

এখন আমরা cert-manager ইনস্টল করতে kubectl ব্যবহার করতে পারি:

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

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

student@cloudshell:~$ kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.2/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 ওমনি ইনস্টল করুন

AlloyDB ইনস্টল করুন ওমনি অপারেটরটি হেলম ইউটিলিটি ব্যবহার করে ইনস্টল করা যেতে পারে।

AlloyDB Omni অপারেটর ইনস্টল করতে নিম্নলিখিত কমান্ডটি চালান:

export GCS_BUCKET=alloydb-omni-operator
export HELM_PATH=$(gcloud storage cat gs://$GCS_BUCKET/latest)
export OPERATOR_VERSION="${HELM_PATH%%/*}"
gcloud storage cp gs://$GCS_BUCKET/$HELM_PATH ./ --recursive
helm install alloydbomni-operator alloydbomni-operator-${OPERATOR_VERSION}.tgz \
--create-namespace \
--namespace alloydb-omni-system \
--atomic \
--timeout 5m

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

student@cloudshell:~$ gcloud storage cp gs://$GCS_BUCKET/$HELM_PATH ./ --recursive
Copying gs://alloydb-omni-operator/1.2.0/alloydbomni-operator-1.2.0.tgz to file://./alloydbomni-operator-1.2.0.tgz
  Completed files 1/1 | 126.5kiB/126.5kiB
student@cloudshell:~$ helm install alloydbomni-operator alloydbomni-operator-${OPERATOR_VERSION}.tgz \
> --create-namespace \
> --namespace alloydb-omni-system \
> --atomic \
> --timeout 5m
NAME: alloydbomni-operator
LAST DEPLOYED: Mon Jan 20 13:13:20 2025
NAMESPACE: alloydb-omni-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
student@cloudshell:~$

AlloyDB Omni অপারেটর ইনস্টল হয়ে গেলে আমরা আমাদের ডাটাবেস ক্লাস্টার স্থাপনের সাথে সাথে ফলোআপ করতে পারি।

এখানে সক্রিয় googleMLExtension প্যারামিটার এবং অভ্যন্তরীণ (প্রাইভেট) লোড ব্যালেন্সার সহ ডিপ্লয়মেন্ট ম্যানিফেস্টের উদাহরণ দেওয়া হল:

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: "15.13.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

পাসওয়ার্ডের গোপন মান হল "VeryStrongPassword" পাসওয়ার্ড শব্দের Base64 প্রতিনিধিত্ব। আরও নির্ভরযোগ্য উপায় হল পাসওয়ার্ড মান সংরক্ষণ করার জন্য Google secret manager ব্যবহার করা। আপনি ডকুমেন্টেশনে এটি সম্পর্কে আরও পড়তে পারেন।

পরবর্তী ধাপে প্রয়োগ করার জন্য ম্যানিফেস্টটিকে my-omni.yaml হিসেবে সংরক্ষণ করুন। আপনি যদি ক্লাউড শেলে থাকেন তবে টার্মিনালের উপরের ডানদিকে "ওপেন এডিটর" বোতাম টিপে এডিটর ব্যবহার করে এটি করতে পারেন।

অনুসরণ

my-omni.yaml নামের ফাইলটি সংরক্ষণ করার পর "Open Terminal" বোতাম টিপে টার্মিনালে ফিরে যান।

7f212c2d2bcafa2b.png সম্পর্কে

kubectl ইউটিলিটি ব্যবহার করে ক্লাস্টারে my-omni.yaml ম্যানিফেস্ট প্রয়োগ করুন:

kubectl apply -f my-omni.yaml

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

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

kubectl ইউটিলিটি ব্যবহার করে আপনার 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

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

Kubernetes Pod ব্যবহার করে সংযোগ করুন

ক্লাস্টার প্রস্তুত হলে আমরা AlloyDB Omni ইনস্ট্যান্স পডে PostgreSQL ক্লায়েন্ট বাইনারি ব্যবহার করতে পারি। আমরা পড আইডি খুঁজে পাই এবং তারপর kubectl ব্যবহার করে সরাসরি পডের সাথে সংযোগ স্থাপন করি এবং ক্লায়েন্ট সফ্টওয়্যার চালাই। পাসওয়ার্ডটি হল VeryStrongPassword যা my-omni.yaml ম্যানিফেস্টে kubernetes গোপনের মাধ্যমে সেট করা হয়েছে:

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 (15.7)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off)
Type "help" for help.

postgres=#

৫. GKE তে AI মডেল স্থাপন করুন

স্থানীয় মডেলগুলির সাথে AlloyDB Omni AI ইন্টিগ্রেশন পরীক্ষা করার জন্য আমাদের ক্লাস্টারে একটি মডেল স্থাপন করতে হবে। আমরা Google এর EmbeddingGemma মডেল ব্যবহার করতে যাচ্ছি।

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

মডেলটি চালানোর জন্য আমাদের ইনফারেন্স চালানোর জন্য একটি নোড পুল প্রস্তুত করতে হবে। আমরা এটি কেবল সিপিইউ পুল বা জিপিইউ অ্যাক্সিলারেটর সহ একটি পুল ব্যবহার করে চালাতে পারি। রিসোর্সের জন্য উচ্চ সম্মতির কারণে কিছু অঞ্চলে কেবল সিপিইউ পদ্ধতিটি আরও কার্যকর হতে পারে। আমাদের ল্যাবে আমরা সিপিইউ পদ্ধতি ব্যবহার করতে যাচ্ছি তবে পারফরম্যান্সের দৃষ্টিকোণ থেকে সেরা পদ্ধতি হল গ্রাফিক অ্যাক্সিলারেটর সহ একটি পুল যেখানে নোড কনফিগারেশন ব্যবহার করা হয় যেমন g2-standard-8 এবং L4 এনভিডিয়া অ্যাক্সিলারেটর।

সিপিইউ ভিত্তিক নোড পুল

e2-standard-32 নোড দিয়ে একটি নোড পুল তৈরি করুন। রিসোর্স বাঁচাতে আমরা আমাদের টানকে একটি নোডে সীমাবদ্ধ রাখব।

export PROJECT_ID=$(gcloud config get 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

আলিঙ্গন মুখের টোকেন পান

এই ল্যাবে আমরা EmbeddingGemma মডেলটি স্থাপন করতে Hugging Face এর সাথে একটি অংশীদারিত্ব ব্যবহার করি এবং এটি করার জন্য আমাদের একটি Hugging Face টোকেন পেতে হবে।

যদি আপনার আগে কোনও টোকেন না থাকে, তাহলে একটি নতুন টোকেন তৈরি করতে নীচের পদক্ষেপগুলি অনুসরণ করুন।

  1. উপরের ডানদিকের কোণায় লগ ইন অথবা সাইন আপ লিঙ্ক ব্যবহার করে হাগিং ফেস সাইটে লগ ইন অথবা সাইন আপ করুন।
  2. আপনার প্রোফাইল -> অ্যাক্সেস টোকেন ক্লিক করুন
  3. আপনার পরিচয় নিশ্চিত করুন
  4. নতুন টোকেন তৈরি করুন এ ক্লিক করুন
  5. আপনার টোকেনের জন্য একটি নাম চয়ন করুন
  6. টোকেনের জন্য একটি ভূমিকা নির্বাচন করুন - আপনার কমপক্ষে পড়ার সুবিধা প্রয়োজন।
  7. পৃষ্ঠার নীচে "টোকেন তৈরি করুন" এ ক্লিক করুন।
  8. তৈরি করা টোকেনটি কপি করুন এবং পরে ব্যবহারের জন্য সংরক্ষণ করুন।

এছাড়াও https://huggingface.co/google/embeddinggemma-300m পৃষ্ঠায় Hugging Face-এ EmbeddingGemma সম্পর্কিত ফাইল এবং বিষয়বস্তু অ্যাক্সেস করার জন্য আপনাকে শর্তাবলী মেনে নিতে হবে।

টোকেন ব্যবহার করে একটি কুবারনেটস গোপনীয়তা তৈরি করুন

ক্লাউড শেল সেশনে এক্সিকিউট করুন (HF_TOKEN এর মানটি আপনার HF টোকেন দিয়ে প্রতিস্থাপন করুন)।

export HF_TOKEN=hf_QjgW...lfrXF
kubectl create secret generic hf-secret \
    --from-literal=hf_api_token=$HF_TOKEN \
    --dry-run=client -o yaml | kubectl apply -f -

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

মডেলটি স্থাপনের জন্য আমাদের একটি স্থাপনার ম্যানিফেস্ট প্রস্তুত করতে হবে।

আমরা Hugging Face থেকে Google এর EmbeddingGemma মডেল ব্যবহার করছি। আপনি এখানে মডেল কার্ডটি পড়তে পারেন। মডেলটি স্থাপনের জন্য আমরা Hugging Face থেকে প্রাপ্ত নির্দেশাবলী এবং GitHub থেকে প্রাপ্ত প্যাকেজের উপর ভিত্তি করে একটি পদ্ধতি ব্যবহার করব।

GitHub থেকে প্যাকেজটি ক্লোন করুন

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

CPU নোডগুলিতে tei (টেক্সট এম্বেডিং ইন্টারফেস) এর জন্য ম্যানিফেস্ট সামঞ্জস্য করুন। আমাদের মডেল, চিত্র, সঠিক রিসোর্স বরাদ্দ সহ বেশ কয়েকটি প্যারামিটার প্রতিস্থাপন করতে হবে এবং কনফিগারেশনে Hugging Face টোকেন সিক্রেট যোগ করতে হবে।

ম্যানিফেস্ট সম্পাদনা করুন (যেকোন উপলব্ধ সম্পাদক ব্যবহার করে)

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

এখানে একটি CPU ভিত্তিক পুলে স্থাপনার জন্য একটি সংশোধিত ম্যানিফেস্ট d=দেওয়া হল।

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
          #image: us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-embeddings-inference-cpu.1-4: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/compute-class: "Performance"
        cloud.google.com/machine-family: "c3"

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

CPU স্থাপনার জন্য পরিবর্তিত ম্যানিফেস্ট প্রয়োগ করে মডেলটি স্থাপন করুন।

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

স্থাপনাগুলি যাচাই করুন

kubectl get pods

মডেল পরিষেবা যাচাই করুন

kubectl get service tei-service

এটি চলমান পরিষেবার ধরণ ClusterIP দেখানোর কথা।

নমুনা আউটপুট:

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 হল আমাদের এন্ডপয়েন্ট ঠিকানা হিসেবে ব্যবহার করার জন্য। মডেল এম্বেডিংটি URI http://34.118.233.48:8080/embed দ্বারা সাড়া দিতে পারে। AlloyDB Omni-তে মডেলটি নিবন্ধন করার পরে এটি ব্যবহার করা হবে।

আমরা kubectl port-forward কমান্ড ব্যবহার করে এটি এক্সপোজ করে পরীক্ষা করতে পারি।

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

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

উপরে "+" চিহ্ন ব্যবহার করে আরেকটি ক্লাউড শেল ট্যাব খুলুন।

abc505ac4d41f24e.png সম্পর্কে

এবং নতুন শেল সেশনে একটি কার্ল কমান্ড চালান।

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]]

যদি আমরা সংখ্যাগুলি দেখি, তাহলে আমরা নিশ্চিত করতে পারব যে আমরা মডেলটি সফলভাবে পরীক্ষা করেছি এবং এখন এটি আমাদের AlloyDB Omni-তে নিবন্ধিত করতে পারি যা সরাসরি SQL থেকে ব্যবহার করা যাবে।

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

আমাদের AlloyDB Omni কীভাবে মোতায়েন করা মডেলের সাথে কাজ করে তা পরীক্ষা করার জন্য আমাদের একটি ডাটাবেস তৈরি করতে হবে এবং মডেলটি নিবন্ধন করতে হবে।

ডাটাবেস তৈরি করুন

আপনার ক্লায়েন্ট VM থেকে AlloyDB Omni-এর সাথে সংযোগ স্থাপনের জন্য একটি জাম্প বক্স হিসেবে একটি GCE VM তৈরি করুন এবং একটি ডাটাবেস তৈরি করুন।

আমাদের জাম্প বক্সটি দরকার কারণ Omni-এর জন্য GKE এক্সটার্নাল লোড ব্যালেন্সার আপনাকে প্রাইভেট IP অ্যাড্রেসিং ব্যবহার করে VPC থেকে অ্যাক্সেস দেয় কিন্তু VPC-এর বাইরে থেকে সংযোগ করার অনুমতি দেয় না। এটি সাধারণভাবে আরও নিরাপদ এবং আপনার ডাটাবেস ইনস্ট্যান্স ইন্টারনেটে প্রকাশ করে না। স্পষ্টতার জন্য দয়া করে চিত্রটি দেখুন।

b4f24ddb5c8c8bf4.png সম্পর্কে

ক্লাউড শেল সেশনে একটি ভিএম তৈরি করতে নিম্নলিখিতটি সম্পাদন করুন:

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

ক্লাউড শেলে kubectl ব্যবহার করে AlloyDB Omni endpoint IP খুঁজুন:

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

প্রাথমিক শেষ বিন্দুটি লিখে রাখুন।

এখানে একটি উদাহরণ আউটপুট রয়েছে:

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

10.131.0.33 হল সেই IP যা আমরা আমাদের উদাহরণগুলিতে AlloyDB Omni ইনস্ট্যান্সের সাথে সংযোগ করার জন্য ব্যবহার করব।

gcloud ব্যবহার করে VM-এর সাথে সংযোগ করুন:

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

যদি ssh কী জেনারেশনের জন্য অনুরোধ করা হয়, তাহলে নির্দেশাবলী অনুসরণ করুন। ডকুমেন্টেশনে ssh সংযোগ সম্পর্কে আরও পড়ুন।

VM ইনস্টল PostgreSQL ক্লায়েন্টের ssh সেশনে:

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

নিম্নলিখিত উদাহরণ ব্যবহার করে AlloyDB Omni লোড ব্যালেন্সার IP ভেরিয়েবলটি রপ্তানি করুন (আপনার লোড ব্যালেন্সার IP দিয়ে IP প্রতিস্থাপন করুন):

export INSTANCE_IP=10.131.0.33

AlloyDB Omni এর সাথে সংযোগ করুন, পাসওয়ার্ডটি VeryStrongPassword যা my-omni.yaml এ হ্যাশের মাধ্যমে সেট করা হয়েছে:

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

প্রতিষ্ঠিত psql সেশনে এক্সিকিউট করুন:

create database demo;

সেশন থেকে বেরিয়ে আসুন এবং ডাটাবেস ডেমোতে সংযোগ করুন (অথবা আপনি একই সেশনে \c demo চালাতে পারেন)

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

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

থার্ড পার্টি এম্বেডিং মডেলের জন্য আমাদের ট্রান্সফর্ম ফাংশন তৈরি করতে হবে যা ইনপুট এবং আউটপুটকে মডেল এবং আমাদের অভ্যন্তরীণ ফাংশন দ্বারা প্রত্যাশিত ফর্ম্যাটে ফর্ম্যাট করে। এই ফাংশনগুলি বিভিন্ন ইন্টারফেসের মধ্যে ফর্ম্যাট রূপান্তর করার জন্য অনুবাদক হিসাবে কাজ করে।

এখানে ট্রান্সফর্ম ফাংশনটি রয়েছে যা ইনপুট পরিচালনা করে:

-- Input Transform Function corresponding to the custom model endpoint
CREATE OR REPLACE FUNCTION tei_text_input_transform(model_id VARCHAR(100), input_text TEXT)
RETURNS JSON
LANGUAGE plpgsql
AS $$
DECLARE
  transformed_input JSON;
  model_qualified_name TEXT;
BEGIN
  SELECT json_build_object('inputs', input_text, 'truncate', true)::JSON INTO transformed_input;
  RETURN transformed_input;
END;
$$;

নমুনা আউটপুটে দেখানো ডেমো ডাটাবেসের সাথে সংযুক্ত থাকাকালীন প্রদত্ত কোডটি কার্যকর করুন:

demo=# -- Input Transform Function corresponding to the custom model endpoint
CREATE OR REPLACE FUNCTION tei_text_input_transform(model_id VARCHAR(100), input_text TEXT)
RETURNS JSON
LANGUAGE plpgsql
AS $$
DECLARE
  transformed_input JSON;
  model_qualified_name TEXT;
BEGIN
  SELECT json_build_object('inputs', input_text, 'truncate', true)::JSON INTO transformed_input;
  RETURN transformed_input;
END;
$$;
CREATE FUNCTION
demo=#

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

-- Output Transform Function corresponding to the custom model endpoint
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=# -- Output Transform Function corresponding to the custom model endpoint
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=#

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

এখন আমরা মডেলটি ডাটাবেসে নিবন্ধন করতে পারি।

মডেলটি embeddinggemma নাম দিয়ে নিবন্ধন করার পদ্ধতিটি এখানে দেওয়া হল। মডেলটি নিবন্ধন করার সময় আমরা আমাদের model_request_url প্যারামিটারে tei-service service name ব্যবহার করি। এটি হল অভ্যন্তরীণ kubernetes ক্লাস্টার পরিষেবার নাম এবং GKE ক্লাস্টারের অভ্যন্তরীণ IP তে অনুবাদ করা হয়:

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=#

আমরা নিম্নলিখিত পরীক্ষামূলক কোয়েরি ব্যবহার করে রেজিস্টার মডেলটি পরীক্ষা করতে পারি যা একটি বাস্তব সংখ্যার অ্যারে প্রদান করবে।

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

ভেক্টর ডেটা ফিরে পেতে দীর্ঘ বিলম্ব দেখে অবাক হবেন না। এই পরীক্ষার জন্য আমরা এম্বেডিং মডেলটি হোস্ট করার জন্য CPU ভিত্তিক নোড পুল ব্যবহার করি এবং এটি GPU সহ নোডগুলিতে অনেক দ্রুত কাজ করে।

৭. AlloyDB Omni তে মডেলটি পরীক্ষা করুন

ডেটা লোড করুন

আমাদের AlloyDB Omni কিভাবে ডিপ্লয় করা মডেলের সাথে কাজ করে তা পরীক্ষা করার জন্য আমাদের কিছু ডেটা লোড করতে হবে। আমি AlloyDB তে ভেক্টর অনুসন্ধানের জন্য অন্য একটি কোডল্যাবের মতো একই ডেটা ব্যবহার করেছি।

ডেটা লোড করার একটি উপায় হল Google Cloud SDK এবং PostgreSQL ক্লায়েন্ট সফ্টওয়্যার ব্যবহার করা। আমরা একই ক্লায়েন্ট VM ব্যবহার করতে পারি। যদি আপনি VM ছবির জন্য ডিফল্ট মান ব্যবহার করে থাকেন তবে Google Cloud SDK ইতিমধ্যেই সেখানে ইনস্টল করা থাকা উচিত। কিন্তু যদি আপনি Google SDK ছাড়া একটি কাস্টম ছবি ব্যবহার করে থাকেন তবে আপনি ডকুমেন্টেশন অনুসরণ করে এটি যোগ করতে পারেন।

নিম্নলিখিত উদাহরণের মতো AlloyDB Omni লোড ব্যালেন্সার IP রপ্তানি করুন (আপনার লোড ব্যালেন্সার IP দিয়ে IP প্রতিস্থাপন করুন):

export INSTANCE_IP=10.131.0.33

ডাটাবেসের সাথে সংযোগ করুন এবং pgvector এক্সটেনশন সক্রিয় করুন।

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

পিএসকিউএল সেশনে:

CREATE EXTENSION IF NOT EXISTS vector;

psql সেশন থেকে প্রস্থান করুন এবং কমান্ড লাইন সেশনে ডেমো ডাটাবেসে ডেটা লোড করার জন্য কমান্ডগুলি কার্যকর করুন।

টেবিল তৈরি করুন। নিম্নলিখিত কমান্ডটি cymbal_demo_schema.sql ফাইলটি পাবে এবং ডেমো ডাটাবেসের সমস্ত টেবিল সংজ্ঞা সহ SQL কার্যকর করবে:

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)
student@cloudshell:~$ 

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"

আমরা আমাদের এম্বেডিং সংরক্ষণ করার জন্য কলাম এম্বেডিং সহ একটি cymbal_embedding টেবিল ব্যবহার করছি এবং ফাংশনে টেক্সট ইনপুট হিসেবে পণ্যের বিবরণ ব্যবহার করছি।

আপনার প্রশ্নের জন্য সময় নির্ধারণ সক্ষম করুন যাতে পরবর্তীতে দূরবর্তী মডেলের সাথে তুলনা করা যায়।:

\timing

এম্বেডিং তৈরি করতে কোয়েরিটি চালান:

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=#

এই উদাহরণে, বিল্ডিং এম্বেডিং করতে প্রায় ৮ মিনিট সময় লেগেছে। CPU ভিত্তিক নোড পুলের ক্ষেত্রে এটি প্রত্যাশিত। GPU অ্যাক্সিলারেটর সহ একটি পুলের ক্ষেত্রে GPU ধরণের উপর নির্ভর করে এটি উল্লেখযোগ্যভাবে দ্রুত হতে পারে।

পরীক্ষামূলক কোয়েরি চালান

psql ব্যবহার করে ডেমো ডাটাবেসের সাথে সংযোগ স্থাপন করুন এবং আমাদের প্রশ্নের জন্য কার্যকর করার সময় পরিমাপ করার জন্য সময় সক্ষম করুন যেমনটি আমরা এম্বেডিং তৈরির জন্য করেছিলাম।

ভেক্টর অনুসন্ধানের জন্য কোসাইন দূরত্বকে অ্যালগরিদম হিসেবে ব্যবহার করে "এখানে কোন ধরণের ফলের গাছ ভালো জন্মে?" এর মতো অনুরোধের সাথে মিলে যাওয়া শীর্ষ ৫টি পণ্য খুঁজে বের করা যাক।

পিএসকিউএল সেশনে এক্সিকিউট করুন:

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
        AND 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
        AND 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;

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

CREATE INDEX cymbal_embedding_scann ON cymbal_embedding USING scann (embedding cosine);

আগের মতো একই কোয়েরি চেষ্টা করুন এবং ফলাফল তুলনা করুন:

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
        AND 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

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

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

আর ভুলে যাবেন না যে AlloyDB Omni-তে আরও বৈশিষ্ট্য এবং ল্যাব রয়েছে।

৮. পরিবেশ পরিষ্কার করুন

এখন আমরা AlloyDB Omni এবং একটি AI মডেল ব্যবহার করে আমাদের GKE ক্লাস্টার মুছে ফেলতে পারি।

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

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

export PROJECT_ID=$(gcloud config get 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 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

যদি আপনি এই কোডল্যাবের জন্য একটি নতুন প্রকল্প তৈরি করে থাকেন, তাহলে আপনি সম্পূর্ণ প্রকল্পটি মুছে ফেলতে পারেন: https://console.cloud.google.com/cloud-resource-manager

৯. অভিনন্দন

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

আমরা যা কভার করেছি

  • গুগল কুবারনেটস ক্লাস্টারে অ্যালয়ডিবি ওমনি কীভাবে স্থাপন করবেন
  • AlloyDB Omni-এর সাথে কীভাবে সংযোগ করবেন
  • AlloyDB Omni তে ডেটা কীভাবে লোড করবেন
  • GKE তে একটি ওপেন এম্বেডিং মডেল কীভাবে স্থাপন করবেন
  • AlloyDB Omni তে এমবেডিং মডেল কিভাবে নিবন্ধন করবেন
  • শব্দার্থিক অনুসন্ধানের জন্য এম্বেডিং কীভাবে তৈরি করবেন
  • AlloyDB Omni-তে শব্দার্থিক অনুসন্ধানের জন্য জেনারেট করা এম্বেডিং কীভাবে ব্যবহার করবেন
  • AlloyDB তে ভেক্টর ইনডেক্স কিভাবে তৈরি এবং ব্যবহার করবেন

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

১০. জরিপ

আউটপুট:

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

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