Kubernetes'te AlloyDB Omni ve yerel yapay zeka modeli.

Kubernetes'te AlloyDB Omni ve yerel yapay zeka modeli.

Bu codelab hakkında

subjectSon güncelleme Şub 25, 2025
account_circleYazan: Gleb Otochkin

1. Giriş

Bu codelab'de, AlloyDB Omni'yi GKE'de nasıl dağıtacağınızı ve aynı Kubernetes kümesinde dağıtılan açık bir yerleşik modelle nasıl kullanacağınızı öğreneceksiniz. Bir modelin aynı GKE kümesinde veritabanı örneğinin yanına dağıtılması, gecikmeyi ve üçüncü taraf hizmetlerine olan bağımlılıkları azaltır. Ayrıca, verilerin kuruluştan çıkmaması ve üçüncü taraf hizmetlerinin kullanımına izin verilmemesi gerektiğinde güvenlik şartları tarafından talep edilebilir.

391e4244b25a7db0.png

Ön koşullar

  • Google Cloud ve Console hakkında temel düzeyde bilgi
  • Komut satırı arayüzü ve Cloud Shell'de temel beceriler

Neler öğreneceksiniz?

  • AlloyDB Omni'yi Google Kubernetes kümesine dağıtma
  • AlloyDB Omni'ye bağlanma
  • AlloyDB Omni'ye veri yükleme
  • Açık yerleşik modelleri GKE'ye dağıtma
  • AlloyDB Omni'ye yerleştirme modelini kaydetme
  • Semantik arama için yerleştirilmiş öğeler oluşturma
  • AlloyDB Omni'de semantik arama için oluşturulan yerleştirilmiş öğeleri kullanma
  • AlloyDB'de vektör dizini oluşturma ve kullanma

Gerekenler

  • Google Cloud hesabı ve Google Cloud projesi
  • Google Cloud Console ve Cloud Shell'ı destekleyen Chrome gibi bir web tarayıcısı

2. Kurulum ve Gereksinimler

Kendine ait tempoda ortam oluşturma

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Proje adı, bu projenin katılımcılarının görünen adıdır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dize otomatik olarak oluşturur. Bu dizenin ne olduğu genellikle önemli değildir. Çoğu kod laboratuvarında proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) referans vermeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele başka bir kimlik oluşturabilirsiniz. Alternatif olarak, kendi anahtarınızı deneyerek kullanılabilir olup olmadığını görebilirsiniz. Bu adımdan sonra değiştirilemez ve proje boyunca geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer (Proje Numarası) olduğunu belirtmek isteriz. Bu üç değer hakkında daha fazla bilgiyi dokümanlar bölümünde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmak çok pahalı değildir. Bu eğitimden sonra faturalandırılmamak için kaynakları kapatmak istiyorsanız oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programına uygundur.

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir olsa da bu kod laboratuvarında bulutta çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.

Google Cloud Console'da, sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:

55efc1aaa7a4d3ad.png

Ortam sağlanıp bağlantı kurulabilmesi için birkaç saniye beklemeniz gerekir. İşlem tamamlandığında aşağıdakine benzer bir ekran görürsünüz:

7ffe5cbb04455448.png

Bu sanal makinede ihtiyaç duyacağınız tüm geliştirme araçları yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu codelab'deki tüm çalışmalarınızı tarayıcıda yapabilirsiniz. Hiçbir şey yüklemeniz gerekmez.

3. Başlamadan önce

API'yi etkinleştirme

Çıkış:

Cloud Shell'de proje kimliğinizin ayarlandığından emin olun:

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

Cloud Shell yapılandırmasında tanımlanmadıysa aşağıdaki komutları kullanarak ayarlayın

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

Gerekli tüm hizmetleri etkinleştirin:

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

Beklenen çıkış

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.

4. AlloyDB Omni&#39;yi GKE&#39;ye dağıtma

AlloyDB Omni'yi GKE'de dağıtmak için AlloyDB Omni operatör koşullarında listelenen koşulları karşılayan bir Kubernetes kümesi hazırlamamız gerekir.

GKE kümesi oluşturma

AlloyDB Omni örneğiyle bir kapsül dağıtmak için yeterli havuz yapılandırmasına sahip standart bir GKE kümesi dağıtmamız gerekiyor. Omni için en az 2 CPU ve 8 GB RAM'e, ayrıca operatör ve izleme hizmetleri için biraz alana ihtiyacımız var.

Dağıtımınız için ortam değişkenlerini ayarlayın.

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

Ardından, GKE standart kümesini oluşturmak için gcloud'u kullanırız.

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

Beklenen konsol çıkışı:

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)$ 

Kümeyi hazırlama

cert-manager hizmeti gibi gerekli bileşenleri yüklememiz gerekiyor. cert-manager kurulumu dokümanlarında yer alan adımları uygulayabiliriz.

Cloud Shell'de zaten yüklü olan kubectl adlı Kubernetes komut satırı aracını kullanırız. Yardımcı programı kullanmadan önce kümemizin kimlik bilgilerini almamız gerekir.

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

Artık kubectl'i kullanarak cert-manager'ı yükleyebiliriz:

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

Beklenen konsol çıkışı(düzenlendi):

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 Omni'yi yükleme

AlloyDB Omni operatörü, helm yardımcı programı kullanılarak yüklenebilir.

AlloyDB Omni operatörünü yüklemek için aşağıdaki komutu çalıştırın:

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

Beklenen konsol çıkışı(düzenlendi):

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 operatörü yüklendiğinde veritabanı kümemizin dağıtımını takip edebiliriz.

Aşağıda, etkinleştirilmiş googleMLExtension parametresi ve dahili (özel) yük dengeleyici içeren dağıtım manifesti örneği verilmiştir:

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

Şifrenin gizli değeri, "ÇokGüçlüŞifre" şifre kelimesinin Base64 gösterimidir. Daha güvenilir bir yöntem, şifre değerini depolamak için Google Secret Manager'ı kullanmaktır. Bu konu hakkında daha fazla bilgiyi dokümanlarda bulabilirsiniz.

Manifesti, sonraki adımda uygulanacak şekilde my-omni.yaml olarak kaydedin. Cloud Shell'deyseniz terminalin sağ üst kısmındaki "Düzenleyiciyi Aç" düğmesine basarak düzenleyiciyi kullanarak bunu yapabilirsiniz.

47ab85dad9afdff7.png

Dosyayı my-omni.yaml olarak kaydettikten sonra "Terminali Aç" düğmesine basarak terminale geri dönün.

b9b7747b39dbe8c7.png

kubectl yardımcı programını kullanarak my-omni.yaml manifestini kümeye uygulayın:

kubectl apply -f my-omni.yaml

Beklenen konsol çıkışı:

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

kubectl yardımcı programını kullanarak my-omni kümenizin durumunu kontrol edin:

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

Dağıtım sırasında küme farklı aşamalardan geçer ve sonunda DBClusterReady durumunda sona erer.

Beklenen konsol çıkışı:

$ 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'ye bağlanma

Kubernetes Kapsülü Kullanarak Bağlanma

Küme hazır olduğunda AlloyDB Omni örnek kapsülündeki PostgreSQL istemci ikililerini kullanabiliriz. Pod kimliğini bulup kubectl'i kullanarak doğrudan pod'a bağlanır ve istemci yazılımını çalıştırırız. Şifre, my-omni.yaml dosyasında karma oluşturma işlemiyle ayarlandığı üzere ÇokGüçlüŞifre'dir:

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

Örnek konsol çıkışı:

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

5. GKE&#39;de yapay zeka modelini dağıtma

AlloyDB Omni AI entegrasyonunu yerel modellerle test etmek için kümeye bir model dağıtmamız gerekir.

Model için düğüm havuzu oluşturma

Modeli çalıştırmak için çıkarım çalıştıracak bir düğüm havuzu hazırlamamız gerekir. Performans açısından en iyi yaklaşım, L4 Nvidia hızlandırıcılı g2-standard-8 gibi bir düğüm yapılandırması kullanan grafik hızlandırıcılara sahip bir havuzdur.

L4 hızlandırıcıyla düğüm havuzu oluşturun:

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

Beklenen çıkış

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 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
Note: Machines with GPUs have certain limitations which may affect your workflow. Learn more at https://cloud.google.com/kubernetes-engine/docs/how-to/gpus
Note: Starting in GKE 1.30.1-gke.115600, if you don't specify a driver version, GKE installs the default GPU driver for your node's GKE version.
Creating node pool gpupool...done.
Created [https://container.googleapis.com/v1/projects/student-test-001/zones/us-central1/clusters/alloydb-ai-gke/nodePools/gpupool].
NAME     MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
gpupool  g2-standard-8  100           1.31.4-gke.1183000

Dağıtım manifestini hazırlama

Modeli dağıtmak için bir dağıtım manifesti hazırlamamız gerekir.

Hugging Face'ın BGE Base v1.5 yerleştirme modelini kullanıyoruz. Model kartını buradan okuyabilirsiniz. Modeli dağıtmak için Hugging Face'taki hazır talimatları ve GitHub'daki dağıtım paketini kullanabiliriz.

Paketi klonlama

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

cloud.google.com/gke-accelerator değerini nvidia-l4 ile değiştirip kaynaklara sınırlar ekleyerek manifest dosyasını düzenleyin.

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

Düzeltilmiş manifesti aşağıda bulabilirsiniz.

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: Snowflake--snowflake-arctic-embed-m
        hf.co/task: text-embeddings
    spec:
      containers:
        - name: tei-container
          image: us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-embeddings-inference-cu122.1-4.ubuntu2204:latest
          resources:
            requests:
              nvidia.com/gpu: 1
            limits:
              nvidia.com/gpu: 1
          env:
            - name: MODEL_ID
              value: Snowflake/snowflake-arctic-embed-m
            - name: NUM_SHARD
              value: "1"
            - name: PORT
              value: "8080"
          volumeMounts:
            - mountPath: /dev/shm
              name: dshm
            - mountPath: /data
              name: data
      volumes:
        - name: dshm
          emptyDir:
            medium: Memory
            sizeLimit: 1Gi
        - name: data
          emptyDir: {}
      nodeSelector:
        cloud.google.com/gke-accelerator: nvidia-l4

Modeli dağıtma

Dağıtım için bir hizmet hesabı ve ad alanı hazırlamamız gerekiyor.

hf-gke-namespace adlı bir Kubernetes ad alanı oluşturun.

export NAMESPACE=hf-gke-namespace
kubectl create namespace $NAMESPACE

Kubernetes hizmet hesabı oluşturma

export SERVICE_ACCOUNT=hf-gke-service-account
kubectl create serviceaccount $SERVICE_ACCOUNT --namespace $NAMESPACE

Modeli dağıtma

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

Dağıtımları doğrulama

kubectl get pods

Model hizmetini doğrulama

kubectl get service tei-service

Çalışan hizmet türünü (ClusterIP) göstermesi gerekir.

Örnek çıktı:

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

Uç nokta adresimiz olarak hizmetin CLUSTER-IP değerini kullanacağız. Model yerleştirme, http://34.118.233.48:8080/embed URI'sine göre yanıt verebilir. Bu ad, modeli AlloyDB Omni'ye kaydettiğinizde daha sonra kullanılır.

kubectl port-forward komutunu kullanarak bu hizmeti kullanıma sunarak test edebiliriz.

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

Bağlantı noktası yönlendirme işlemi bir Cloud Shell oturumunda çalışacak ve bunu test etmek için başka bir oturuma ihtiyacımız var.

Üstteki "+" işaretini kullanarak başka bir Cloud Shell sekmesi açın.

4ca978f5142bb6ce.png

Ardından yeni kabuk oturumunda bir curl komutu çalıştırın.

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

Aşağıdaki örnek çıkışta (gizlenmiş) gösterildiği gibi bir vektör dizisi döndürür:

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

6. Modeli AlloyDB Omni&#39;ye kaydetme

AlloyDB Omni'nin dağıtılan modelle nasıl çalıştığını test etmek için bir veritabanı oluşturmamız ve modeli kaydetmemiz gerekir.

Veritabanı Oluşturma

Atlama kutusu olarak bir GCE sanal makinesi oluşturun, istemci sanal makinenizden AlloyDB Omni'ye bağlanın ve bir veritabanı oluşturun.

Omni için GKE harici yük dengeleyicisi, özel IP adreslemeyi kullanarak VPC'den erişim sağlar ancak VPC dışından bağlanmanıza izin vermez. Bu nedenle, atlama kutusuna ihtiyacımız var. Genel olarak daha güvenlidir ve veritabanı örneğinizi internete maruz bırakmaz. Daha net bilgi için lütfen şemayı inceleyin.

391e4244b25a7db0.png

Cloud Shell oturumunda sanal makine oluşturmak için şunları yürütün:

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

Cloud Shell'de kubectl kullanarak AlloyDB Omni uç noktası IP'sini bulun:

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

PRIMARYENDPOINT değerini not edin. Aşağıda bir örnek verilmiştir.

çıktı:

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, AlloyDB Omni örneğine bağlanmak için örneklerimizde kullanacağımız IP adresidir.

gcloud kullanarak sanal makineye bağlanın:

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

SSH anahtarı oluşturma isteğinde bulunulursa talimatları uygulayın. SSH bağlantısı hakkında daha fazla bilgiyi dokümanlar bölümünde bulabilirsiniz.

Sanal makinenin SSH oturumunda PostgreSQL istemcisini yükleyin:

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

AlloyDB Omni yük dengeleyici IP'sini aşağıdaki örnekte gösterildiği gibi dışa aktarın (IP'yi yük dengeleyici IP'nizle değiştirin):

export INSTANCE_IP=10.131.0.33

AlloyDB Omni'ye bağlanın. Şifre, my-omni.yaml dosyasında karma oluşturma işlemiyle ayarlandığı gibi ÇokGüçlüŞifre'dir:

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

Oluşturulan psql oturumunda şunları yürütün:

create database demo;

Oturumdan çıkın ve veritabanı demosuna bağlanın (veya aynı oturumda "\c demo" komutunu çalıştırabilirsiniz)

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

Dönüşüm işlevleri oluşturma

Üçüncü taraf yerleştirme modelleri için girişi ve çıkışı modelin ve dahili işlevlerimizin beklediği biçimde biçimlendiren dönüştürme işlevleri oluşturmamız gerekir.

Girişle ilgilenen dönüştürme işlevi aşağıda verilmiştir:

-- 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 veritabanına bağlıyken örnek çıkışta gösterildiği gibi sağlanan kodu yürütün:

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

Modelden gelen yanıtı gerçek sayılar dizisine dönüştüren çıkış işlevi ise şu şekildedir:

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

Aynı oturumda çalıştırın:

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

Modeli kaydetme

Artık modeli veritabanına kaydedebiliriz.

Modeli bge-base-1.5 adıyla kaydettirmek için aşağıdaki prosedür çağrısını kullanın. 34.118.233.48 IP adresini model hizmetinizin IP adresiyle (kubectl get service tei-service komutunun çıkışı) değiştirin:

CALL
  google_ml.create_model(
    model_id => 'bge-base-1.5',
    model_request_url => 'http://34.118.233.48: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 veritabanına bağlıyken sağlanan kodu yürütün:

demo=# CALL
  google_ml.create_model(
    model_id => 'bge-base-1.5',
    model_request_url => 'http://34.118.233.48: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=#

Gerçek sayı dizisi döndürmesi gereken aşağıdaki test sorgusunu kullanarak kayıt modelini test edebiliriz.

select google_ml.embedding('bge-base-1.5','What is AlloyDB Omni?');

7. Modeli AlloyDB Omni&#39;de test etme

Veri Yükleme

AlloyDB Omni'nin dağıtılan modelle nasıl çalıştığını test etmek için bazı veriler yüklememiz gerekir. AlloyDB'de vektör arama için diğer kod laboratuvarlarından birinde kullanılan verileri kullandım.

Verileri yüklemenin bir yolu, Google Cloud SDK'sını ve PostgreSQL istemci yazılımını kullanmaktır. Demo veritabanını oluşturmak için kullanılan istemci sanal makinesini kullanabiliriz. Sanal makine resmi için varsayılan ayarları kullandıysanız Google Cloud SDK'sı zaten yüklenmiş olmalıdır. Ancak Google SDK'sı olmadan özel bir resim kullandıysanız dokümanları inceleyerek bu resmi ekleyebilirsiniz.

AlloyDB Omni yük dengeleyici IP'sini aşağıdaki örnekte gösterildiği gibi dışa aktarın (IP'yi yük dengeleyici IP'nizle değiştirin):

export INSTANCE_IP=10.131.0.33

Veritabanına bağlanın ve pgvector uzantısını etkinleştirin.

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

psql oturumunda:

CREATE EXTENSION IF NOT EXISTS vector;

psql oturumundan çıkın ve komut satırı oturumunda verileri demo veritabanına yüklemek için komutları yürütün.

Tabloları oluşturun:

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

Beklenen konsol çıkışı:

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:~$ 

Oluşturulan tabloların listesi aşağıda verilmiştir:

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

Çıkış:

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 tablosuna veri yükleyin:

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"

Beklenen konsol çıkışı:

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 tablosundaki birkaç satırın örneği aşağıda verilmiştir.

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"

Çıkış:

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 tablosuna veri yükleyin:

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"

Beklenen konsol çıkışı:

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 tablosundaki birkaç satırın örneğini aşağıda bulabilirsiniz.

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

Çıkış:

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 tablosuna veri yükleyin:

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"

Beklenen konsol çıkışı:

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 tablosundaki birkaç satırın örneğini aşağıda bulabilirsiniz.

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

Çıkış:

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:~$ 

Yerleştirme oluşturma

psql kullanarak demo veritabanına bağlanın ve cymbal_products tablosunda açıklanan ürünler için ürün adlarına ve açıklamalarına göre yerleştirmeler oluşturun.

Demo veritabanına bağlanın:

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

Yerleşimlerimizi depolamak için sütun yerleştirme içeren bir cymbal_embedding tablosu kullanıyoruz ve işleve metin girişi olarak ürün açıklamasını kullanıyoruz.

Sorgularınızın daha sonra uzak modellerle karşılaştırılması için zamanlamayı etkinleştirin.:

\timing

Yerleşimleri oluşturmak için sorguyu çalıştırın:

INSERT INTO cymbal_embedding(uniq_id,embedding)  SELECT uniq_id, google_ml.embedding('bge-base-1.5',product_description)::vector FROM cymbal_products;

Beklenen konsol çıkışı:

demo=#  INSERT INTO cymbal_embedding(uniq_id,embedding)  SELECT uniq_id, google_ml.embedding('bge-base-1.5',product_description)::vector FROM cymbal_products;
INSERT 0 941
Time: 11069.762 ms (00:11.070)
demo=#

Bu örnekte, 941 kayıt için yerleştirme oluşturma işlemi yaklaşık 11 saniye sürdü.

Test sorguları çalıştırma

psql kullanarak demo veritabanına bağlanın ve zamanlamayı etkinleştirerek sorgularımızın yürütme süresini ölçün. Bunu, yerleştirmeler oluştururken yaptığımız gibi yapın.

Vektör arama algoritması olarak kosinüs uzaklığını kullanarak "Burada hangi meyve ağaçları iyi yetişir?" gibi bir istekle eşleşen en iyi 5 ürünü bulalım.

psql oturumunda şunları yürütün:

SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (ce.embedding <=> google_ml.embedding('bge-base-1.5','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;

Beklenen konsol çıkışı:

demo=# SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (ce.embedding <=> google_ml.embedding('bge-base-1.5','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
-----------------------+----------------------------------------------------------------------------------+------------+----------+---------------------
 California Sycamore   | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is  |     300.00 |    93230 | 0.22753925487632942
 Toyon                 | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 | 0.23497374266229387
 California Peppertree | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e |      25.00 |    93230 | 0.24215884459965364
 California Redwood    | This is a beautiful redwood tree that can grow to be over 300 feet tall. It is a |    1000.00 |    93230 | 0.24564130578287147
 Cherry Tree           | This is a beautiful cherry tree that will produce delicious cherries. It is an d |      75.00 |    93230 | 0.24846117929767153
(5 rows)

Time: 28.724 ms
demo=#

Sorgu 28 ms çalıştı ve cymbal_products tablosundaki istekle eşleşen ve 1583 numaralı mağazada bulunan envanteri içeren bir ağaç listesi döndürdü.

ANN dizini oluşturma

Yalnızca küçük bir veri kümemiz olduğunda tüm yerleştirmeleri tarayan tam aramayı kullanmak kolaydır ancak veriler arttığında yükleme ve yanıt süresi de artar. Performansı artırmak için yerleştirme verilerinizle dizinler oluşturabilirsiniz. Vektör verileri için Google ScaNN dizini kullanılarak bu işlemin nasıl yapılacağına dair bir örnek aşağıda verilmiştir.

Bağlantıyı kaybettiyseniz demo veritabanına yeniden bağlanın:

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

alloydb_scann uzantısını etkinleştirin:

CREATE EXTENSION IF NOT EXISTS alloydb_scann;

Dizini oluşturun:

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

Öncekiyle aynı sorguyu deneyin ve sonuçları karşılaştırın:

demo=# SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (ce.embedding <=> google_ml.embedding('bge-base-1.5','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
-----------------------+----------------------------------------------------------------------------------+------------+----------+---------------------
 California Sycamore   | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is  |     300.00 |    93230 | 0.22753925487632942
 Toyon                 | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 | 0.23497374266229387
 California Peppertree | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e |      25.00 |    93230 | 0.24215884459965364
 California Redwood    | This is a beautiful redwood tree that can grow to be over 300 feet tall. It is a |    1000.00 |    93230 | 0.24564130578287147
 Fremont Cottonwood    | This is a beautiful cottonwood tree that can grow to be over 100 feet tall. It i |     200.00 |    93230 |  0.2533482837690365
(5 rows)

Time: 14.665 ms
demo=#

Sorgu yürütme süresi biraz azaldı ve bu kazanç daha büyük veri kümelerinde daha belirgin olacaktır. Sonuçlar oldukça benzer. Yalnızca Kiraz, Fremont Cottonwood ile değiştirildi.

Başka sorgular deneyin ve dokümanlar bölümünden vektör dizini seçme hakkında daha fazla bilgi edinin.

AlloyDB Omni'nin daha fazla özellik ve laboratuvar sunduğunu unutmayın.

8. Ortamı temizleme

Artık AlloyDB Omni ve bir yapay zeka modeliyle GKE kümemizi silebiliriz.

GKE kümesini silme

Cloud Shell'de şunları çalıştırın:

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}

Beklenen konsol çıkışı:

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

Sanal makineyi silme

Cloud Shell'de şunları çalıştırın:

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

Beklenen konsol çıkışı:

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

Bu kod laboratuvarı için yeni bir proje oluşturduysanız projenin tamamını silebilirsiniz: https://console.cloud.google.com/cloud-resource-manager

9. Tebrikler

Codelab'i tamamladığınız için tebrikler.

Ele aldığımız konular

  • AlloyDB Omni'yi Google Kubernetes kümesine dağıtma
  • AlloyDB Omni'ye bağlanma
  • AlloyDB Omni'ye veri yükleme
  • Açık yerleşik modelleri GKE'ye dağıtma
  • AlloyDB Omni'ye yerleştirme modelini kaydetme
  • Semantik arama için yerleştirilmiş öğeler oluşturma
  • AlloyDB Omni'de semantik arama için oluşturulan yerleştirilmiş öğeleri kullanma
  • AlloyDB'de vektör dizini oluşturma ve kullanma

AlloyDB Omni'de yapay zeka ile çalışma hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.

10. Anket

Çıkış:

Bu eğitimi nasıl kullanacaksınız?