AlloyDB Omni และโมเดล AI ในเครื่องบน Kubernetes

1. บทนำ

ในโค้ดแล็บนี้ คุณจะได้เรียนรู้วิธีทำให้ AlloyDB Omni ใช้งานได้ใน GKE และใช้กับรูปแบบการฝังแบบเปิดที่ติดตั้งใช้งานในคลัสเตอร์ Kubernetes เดียวกัน การปรับใช้โมเดลข้างอินสแตนซ์ฐานข้อมูลในคลัสเตอร์ GKE เดียวกันจะช่วยลดเวลาในการตอบสนองและการพึ่งพาบริการของบุคคลที่สาม นอกจากนี้ ข้อกำหนดด้านความปลอดภัยอาจกำหนดให้ต้องดำเนินการดังกล่าวเมื่อข้อมูลไม่ควรออกจากองค์กรและไม่อนุญาตให้ใช้บริการของบุคคลที่สาม

391e4244b25a7db0.png

ข้อกำหนดเบื้องต้น

  • ความเข้าใจพื้นฐานเกี่ยวกับคอนโซล Google Cloud
  • ทักษะพื้นฐานในอินเทอร์เฟซบรรทัดคำสั่งและ Cloud Shell

สิ่งที่คุณจะได้เรียนรู้

  • วิธีทำให้ AlloyDB Omni ใช้งานได้ในคลัสเตอร์ Google Kubernetes
  • วิธีเชื่อมต่อกับ AlloyDB Omni
  • วิธีโหลดข้อมูลไปยัง AlloyDB Omni
  • วิธีทำให้โมเดลการฝังแบบเปิดใช้งานได้ใน GKE
  • วิธีลงทะเบียนโมเดลการฝังใน AlloyDB Omni
  • วิธีสร้างการฝังสําหรับการค้นหาเชิงความหมาย
  • วิธีใช้การฝังที่สร้างขึ้นสำหรับการค้นหาเชิงความหมายใน AlloyDB Omni
  • วิธีสร้างและใช้ดัชนีเวกเตอร์ใน AlloyDB

สิ่งที่ต้องมี

  • บัญชี Google Cloud และโปรเจ็กต์ Google Cloud
  • เว็บเบราว์เซอร์ เช่น Chrome ที่รองรับ Google Cloud Console และ Cloud Shell

2. การตั้งค่าและข้อกําหนด

การตั้งค่าสภาพแวดล้อมด้วยตนเอง

  1. ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณจะอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะต้องไม่ซ้ำกันสำหรับโปรเจ็กต์ Google Cloud ทั้งหมดและจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) คอนโซล Cloud จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นจะเป็นอะไร ในโค้ดแล็บส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (ปกติจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสอื่นแบบสุ่มได้ หรือจะลองใช้อุปกรณ์ของคุณเองเพื่อดูว่าอุปกรณ์พร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงหลังจากขั้นตอนนี้ไม่ได้ และชื่อนี้จะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ามีค่าที่ 3 ซึ่งเป็นหมายเลขโปรเจ็กต์ที่ API บางรายการใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 รายการนี้ได้ในเอกสารประกอบ
  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตามโค้ดแล็บนี้จะไม่เสียค่าใช้จ่ายมากนัก หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินหลังจากบทแนะนำนี้ คุณลบทรัพยากรที่สร้างไว้หรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

เริ่ม Cloud Shell

แม้ว่าคุณจะดำเนินการกับ Google Cloud จากระยะไกลจากแล็ปท็อปได้ แต่ในโค้ดแล็บนี้ คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

จากคอนโซล Google Cloud ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

55efc1aaa7a4d3ad.png

การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อดำเนินการเสร็จแล้ว คุณควรเห็นข้อมูลดังต่อไปนี้

7ffe5cbb04455448.png

เครื่องเสมือนนี้โหลดเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ ซึ่งจะมีไดเรกทอรีหลักขนาด 5 GB ถาวรและทำงานบน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพเครือข่ายและการรับรองได้อย่างมีประสิทธิภาพ คุณทํางานทั้งหมดในโค้ดแล็บนี้ได้ภายในเบราว์เซอร์ คุณไม่จำเป็นต้องติดตั้งอะไรเลย

3. ก่อนเริ่มต้น

เปิดใช้ API

เอาต์พุต:

ใน Cloud Shell ให้ตรวจสอบว่าได้ตั้งค่ารหัสโปรเจ็กต์แล้ว โดยทำดังนี้

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

หากไม่ได้กำหนดไว้ในการกำหนดค่า Cloud Shell ให้ตั้งค่าโดยใช้คำสั่งต่อไปนี้

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.

4. ติดตั้งใช้งาน AlloyDB Omni ใน GKE

หากต้องการติดตั้งใช้งาน AlloyDB Omni ใน GKE เราต้องเตรียมคลัสเตอร์ Kubernetes ตามข้อกำหนดที่ระบุไว้ในข้อกำหนดของโอเปอเรเตอร์ AlloyDB Omni

สร้างคลัสเตอร์ GKE

เราต้องติดตั้งใช้งานคลัสเตอร์ GKE มาตรฐานที่มีการกําหนดค่าพูลที่เพียงพอสําหรับติดตั้งใช้งานพ็อดที่มีอินสแตนซ์ AlloyDB Omni เราต้องใช้ CPU อย่างน้อย 2 ตัวและ RAM 8 GB สำหรับ Omni โดยเหลือพื้นที่ว่างไว้สำหรับบริการของผู้ให้บริการและการตรวจสอบ

ตั้งค่าตัวแปรสภาพแวดล้อมสําหรับการทําให้ใช้งานได้

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

จากนั้นใช้ gcloud เพื่อสร้างคลัสเตอร์ 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:~ (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 เราสามารถทำตามขั้นตอนในเอกสารประกอบสำหรับการติดตั้ง cert-manager

เราจะใช้เครื่องมือบรรทัดคำสั่งของ Kubernetes อย่าง kubectl ซึ่งติดตั้งไว้ใน Cloud Shell อยู่แล้ว ก่อนที่จะใช้ยูทิลิตีนี้ เราจำเป็นต้องขอข้อมูลเข้าสู่ระบบสำหรับคลัสเตอร์

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

ติดตั้งโอเปอเรเตอร์ AlloyDB Omni ได้โดยใช้ยูทิลิตี Helm

เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งโอเปอเรเตอร์ 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 แล้ว เราจะติดตามผลการติดตั้งใช้งานคลัสเตอร์ฐานข้อมูลได้

ต่อไปนี้คือตัวอย่างไฟล์ Manifest ของการติดตั้งใช้งานที่มีพารามิเตอร์ 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.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

ค่าลับของรหัสผ่านคือการแสดงผลแบบ Base64 ของคํารหัสผ่าน "VeryStrongPassword" วิธีที่น่าเชื่อถือกว่าคือการใช้เครื่องมือจัดการข้อมูลลับของ Google เพื่อจัดเก็บค่ารหัสผ่าน อ่านข้อมูลเพิ่มเติมได้ในเอกสารประกอบ

บันทึกไฟล์ Manifest เป็น my-omni.yaml เพื่อใช้ในขั้นตอนถัดไป หากอยู่ใน Cloud Shell คุณจะดำเนินการได้โดยใช้เครื่องมือแก้ไขโดยกดปุ่ม "เปิดเครื่องมือแก้ไข" ที่ด้านขวาบนของเทอร์มินัล

47ab85dad9afdff7.png

หลังจากบันทึกไฟล์ชื่อ my-omni.yaml แล้ว ให้กลับไปที่เทอร์มินัลโดยกดปุ่ม "เปิดเทอร์มินัล"

b9b7747b39dbe8c7.png

ใช้ไฟล์ Manifest my-omni.yaml กับคลัสเตอร์โดยใช้ยูทิลิตี kubectl โดยทำดังนี้

kubectl apply -f my-omni.yaml

ผลลัพธ์ที่คาดหวังในคอนโซล

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

ตรวจสอบสถานะคลัสเตอร์ my-omni โดยใช้ยูทิลิตี kubectl

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

เมื่อคลัสเตอร์พร้อมแล้ว เราจะใช้ไบนารีไคลเอ็นต์ PostgreSQL ในพ็อดอินสแตนซ์ AlloyDB Omni ได้ เราจะค้นหารหัสพ็อด จากนั้นใช้ kubectl เพื่อเชื่อมต่อกับพ็อดโดยตรงและเรียกใช้ซอฟต์แวร์ไคลเอ็นต์ รหัสผ่านคือ 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 (15.7)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off)
Type "help" for help.

postgres=#

5. ทำให้โมเดล AI ใช้งานได้ใน GKE

หากต้องการทดสอบการผสานรวม AlloyDB Omni AI กับโมเดลในเครื่อง เราต้องทำให้โมเดลใช้งานได้ในคลัสเตอร์

สร้าง Node Pool สําหรับโมเดล

หากต้องการเรียกใช้โมเดล เราต้องเตรียมกลุ่มโหนดเพื่อเรียกใช้การอนุมาน แนวทางที่ดีที่สุดจากมุมมองประสิทธิภาพคือพูลที่มีตัวเร่งกราฟิกโดยใช้การกำหนดค่าโหนด เช่น g2-standard-8 ที่มีตัวเร่ง 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

ผลลัพธ์ที่คาดหวัง

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

เตรียมไฟล์ Manifest สำหรับการทำให้ใช้งานได้

เราต้องเตรียมไฟล์ Manifest สำหรับการทําให้ใช้งานได้เพื่อทำให้โมเดลใช้งานได้

เราใช้โมเดลการฝัง BGE Base v1.5 จาก Hugging Face อ่านการ์ดรูปแบบได้ที่นี่ หากต้องการทำให้โมเดลใช้งานได้ เราสามารถใช้วิธีการที่เตรียมไว้แล้วจาก Hugging Face และแพ็กเกจการทำให้ใช้งานได้จาก GitHub

โคลนแพ็กเกจ

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

แก้ไขไฟล์ Manifest โดยแทนที่ค่า cloud.google.com/gke-accelerator ด้วย nvidia-l4 และเพิ่มขีดจำกัดให้กับทรัพยากร

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

นี่คือไฟล์ Manifest ที่แก้ไขแล้ว

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

ทำให้โมเดลใช้งานได้

เราต้องเตรียมบัญชีบริการและเนมสเปซสําหรับการติดตั้งใช้งาน

สร้างเนมสเปซ hf-gke-namespace ของ Kubernetes

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

สร้างบัญชีบริการ Kubernetes

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

ทำให้โมเดลใช้งานได้

kubectl apply -f Google-Cloud-Containers/examples/gke/tei-deployment/gpu-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

การกําหนดค่าการกําหนดเส้นทางพอร์ตจะทํางานในเซสชัน Cloud Shell 1 เซสชัน และเราต้องการเซสชันอื่นเพื่อทดสอบ

เปิดแท็บ Cloud Shell อื่นโดยใช้เครื่องหมาย "+" ที่ด้านบน

4ca978f5142bb6ce.png

และเรียกใช้คำสั่ง curl ในเซสชัน Shell ใหม่

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

6. ลงทะเบียนโมเดลใน AlloyDB Omni

หากต้องการทดสอบประสิทธิภาพของ AlloyDB Omni กับโมเดลที่ติดตั้งใช้งาน เราต้องสร้างฐานข้อมูลและลงทะเบียนโมเดล

สร้างฐานข้อมูล

สร้าง GCE VM เป็น Jump Box, เชื่อมต่อกับ AlloyDB Omni จาก VM ของลูกค้า และสร้างฐานข้อมูล

เราต้องใช้ Jump Box เนื่องจากตัวจัดสรรภาระงานภายนอก GKE สำหรับ Omni ให้คุณเข้าถึงจาก VPC โดยใช้การกำหนดที่อยู่ IP ส่วนตัว แต่ไม่อนุญาตให้คุณเชื่อมต่อจากภายนอก VPC ซึ่งโดยทั่วไปแล้วจะมีความปลอดภัยมากกว่าและไม่เปิดเผยอินสแตนซ์ฐานข้อมูลของคุณต่ออินเทอร์เน็ต โปรดดูความชัดเจนในแผนภาพ

391e4244b25a7db0.png

หากต้องการสร้าง VM ในเซสชัน Cloud Shell ให้ทำดังนี้

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

ค้นหา IP ของปลายทาง AlloyDB Omni โดยใช้ kubectl ใน Cloud Shell โดยทำดังนี้

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

จด PRIMARYENDPOINT ไว้ ดังตัวอย่างต่อไปนี้

output:

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

เชื่อมต่อกับ VM โดยใช้ gcloud

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

หากได้รับข้อความแจ้งให้สร้างคีย์ SSH ให้ทำตามวิธีการ อ่านเพิ่มเติมเกี่ยวกับการเชื่อมต่อ SSH ในเอกสารประกอบ

ในเซสชัน SSH ไปยัง VM ให้ติดตั้งไคลเอ็นต์ PostgreSQL โดยทำดังนี้

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

ส่งออก IP ตัวจัดสรรภาระงาน AlloyDB Omni ดังตัวอย่างต่อไปนี้ (แทนที่ 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=#

ลงทะเบียนโมเดล

ตอนนี้เราลงทะเบียนโมเดลในฐานข้อมูลได้แล้ว

นี่คือการเรียกใช้กระบวนการเพื่อลงทะเบียนโมเดลที่มีชื่อ bge-base-1.5 แทนที่ IP 34.118.233.48 ด้วยที่อยู่ IP ของบริการโมเดล (เอาต์พุตจาก kubectl get service tei-service)

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

เราทดสอบโมเดลการลงทะเบียนได้โดยใช้การค้นหาทดสอบต่อไปนี้ ซึ่งควรแสดงผลอาร์เรย์ตัวเลขจริง

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

7. ทดสอบโมเดลใน AlloyDB Omni

โหลดข้อมูล

เราต้องโหลดข้อมูลบางส่วนเพื่อทดสอบว่า AlloyDB Omni ทำงานร่วมกับโมเดลที่ติดตั้งใช้งานอย่างไร เราใช้ข้อมูลเดียวกับในโค้ดแล็บอื่นๆ สำหรับการค้นหาเวกเตอร์ใน AlloyDB

วิธีหนึ่งในการโหลดข้อมูลคือการใช้ Google Cloud SDK และซอฟต์แวร์ไคลเอ็นต์ PostgreSQL เราสามารถใช้ VM ของไคลเอ็นต์เดียวกันกับที่ใช้สร้างฐานข้อมูลเดโม Google Cloud SDK ควรติดตั้งไว้แล้วหากคุณใช้ค่าเริ่มต้นสำหรับอิมเมจ VM แต่หากคุณใช้รูปภาพที่กำหนดเองโดยไม่มี Google SDK คุณสามารถเพิ่มรูปภาพดังกล่าวได้โดยทำตามเอกสารประกอบ

ส่งออก IP ตัวจัดสรรภาระงาน AlloyDB Omni ดังตัวอย่างต่อไปนี้ (แทนที่ IP ด้วย IP ตัวจัดสรรภาระงานของคุณ)

export INSTANCE_IP=10.131.0.33

เชื่อมต่อกับฐานข้อมูลและเปิดใช้ส่วนขยาย pgvector

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

ในเซสชัน psql ให้ทำดังนี้

CREATE EXTENSION IF NOT EXISTS vector;

ออกจากเซสชัน psql และในเซสชันบรรทัดคำสั่ง ให้เรียกใช้คําสั่งเพื่อโหลดข้อมูลไปยังฐานข้อมูลเดโม

สร้างตาราง

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

ต่อไปนี้คือตัวอย่าง 2-3 แถวจากตาราง 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:~$ 

ต่อไปนี้คือตัวอย่าง 2-3 แถวจากตาราง 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:~$

ต่อไปนี้คือตัวอย่าง 2-3 แถวจากตาราง 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('bge-base-1.5',product_description)::vector FROM cymbal_products;

ผลลัพธ์ที่คาดหวังในคอนโซล

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

ในตัวอย่างนี้ การสร้างการฝังสําหรับระเบียน 941 รายการใช้เวลาประมาณ 11 วินาที

เรียกใช้ข้อความค้นหาทดสอบ

เชื่อมต่อกับฐานข้อมูลเดโมโดยใช้ psql และเปิดใช้การจับเวลาเพื่อวัดเวลาในการดำเนินการของคําค้นหาเช่นเดียวกับการสร้างการฝัง

มาค้นหาผลิตภัณฑ์ 5 อันดับแรกที่ตรงกับคำขออย่าง "ต้นผลไม้ชนิดใดที่ปลูกได้ดีที่นี่" โดยใช้ระยะทางโคไซน์เป็นอัลกอริทึมสำหรับการค้นหาเวกเตอร์

ในเซสชัน psql ให้ดำเนินการต่อไปนี้

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;

ผลลัพธ์ที่คาดหวังในคอนโซล

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

การค้นหาใช้เวลา 28 มิลลิวินาทีและแสดงรายการต้นไม้จากตาราง cymbal_products ที่ตรงกับคําขอและมีสินค้าพร้อมจําหน่ายในร้านค้าหมายเลข 1583

สร้างดัชนี 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('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=#

เวลาในการเรียกใช้การค้นหาลดลงเล็กน้อย และผลลัพธ์ที่ได้จะสังเกตได้ชัดเจนขึ้นเมื่อใช้ชุดข้อมูลขนาดใหญ่ ผลลัพธ์ค่อนข้างคล้ายกัน และมีเพียงเชอร์รี่เท่านั้นที่ถูกแทนที่ด้วยเฟรมอนต์คอตตอนวูด

ลองใช้ข้อความค้นหาอื่นๆ และอ่านเพิ่มเติมเกี่ยวกับการเลือกดัชนีเวกเตอร์ในเอกสารประกอบ

และอย่าลืมว่า AlloyDB Omni มีฟีเจอร์และห้องทดลองอีกมากมาย

8. ล้างสภาพแวดล้อม

ตอนนี้เราลบคลัสเตอร์ GKE ด้วย AlloyDB Omni และโมเดล AI ได้แล้ว

ลบคลัสเตอร์ GKE

ใน Cloud Shell ให้ดำเนินการต่อไปนี้

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

ลบ VM

ใน Cloud Shell ให้ดำเนินการต่อไปนี้

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

หากสร้างโปรเจ็กต์ใหม่สำหรับ Codelab นี้ คุณสามารถลบโปรเจ็กต์ทั้งหมดแทนได้ที่ https://console.cloud.google.com/cloud-resource-manager

9. ขอแสดงความยินดี

ขอแสดงความยินดีที่ทํา Codelab จนเสร็จสมบูรณ์

สิ่งที่เราได้พูดถึง

  • วิธีทำให้ AlloyDB Omni ใช้งานได้ในคลัสเตอร์ Google Kubernetes
  • วิธีเชื่อมต่อกับ AlloyDB Omni
  • วิธีโหลดข้อมูลไปยัง AlloyDB Omni
  • วิธีทำให้โมเดลการฝังแบบเปิดใช้งานได้ใน GKE
  • วิธีลงทะเบียนโมเดลการฝังใน AlloyDB Omni
  • วิธีสร้างการฝังสําหรับการค้นหาเชิงความหมาย
  • วิธีใช้การฝังที่สร้างขึ้นสำหรับการค้นหาเชิงความหมายใน AlloyDB Omni
  • วิธีสร้างและใช้ดัชนีเวกเตอร์ใน AlloyDB

อ่านข้อมูลเพิ่มเติมเกี่ยวกับการทำงานกับ AI ใน AlloyDB Omni ได้ในเอกสารประกอบ

10. แบบสำรวจ

เอาต์พุต:

คุณจะใช้บทแนะนำนี้อย่างไร

อ่านอย่างเดียว อ่านและทำแบบฝึกหัดให้เสร็จ