AlloyDB Omni và EmbeddingGemma với Gemma 4 trên Kubernetes

1. Giới thiệu

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách triển khai AlloyDB Omni trên Google Kubernetes Engine (GKE) và sử dụng AlloyDB Omni với các mô hình mở như EmbeddingGemmaGemma 4 để tạo các bản nhúng và dự đoán. Việc chạy cả cơ sở dữ liệu và các mô hình trong cùng một cụm giúp giảm độ trễ mạng và tránh các phần phụ thuộc vào dịch vụ bên thứ ba. Tính năng này cũng giúp đáp ứng các yêu cầu về việc tuân thủ và nơi lưu trữ dữ liệu vì dữ liệu của bạn không bao giờ rời khỏi môi trường của bạn.

Sơ đồ kiến trúc của AlloyDB Omni và EmbeddingGemma trên GKE

Điều kiện tiên quyết

  • Hiểu biết cơ bản về Google Cloud và Google Cloud Console
  • Kiến thức cơ bản về Kubernetes và GKE
  • Làm quen với giao diện dòng lệnh và Google Cloud Shell

Kiến thức bạn sẽ học được

  • Cách triển khai AlloyDB Omni trên một cụm GKE
  • Cách kết nối với AlloyDB Omni
  • Cách tải dữ liệu vào AlloyDB Omni
  • Cách triển khai các mô hình AI (mô hình nhúng và mô hình ngôn ngữ lớn) vào GKE
  • Cách đăng ký mô hình AI trong AlloyDB Omni
  • Cách tạo các vectơ nhúng cho tính năng tìm kiếm ngữ nghĩa
  • Cách chạy các truy vấn tìm kiếm ngữ nghĩa trong AlloyDB Omni
  • Cách tạo và sử dụng chỉ mục vectơ trong AlloyDB Omni

Bạn cần có

  • Tài khoản Google Cloud và dự án trên đám mây của Google Cloud
  • Một trình duyệt web như Chrome

2. Thiết lập và yêu cầu

Thiết lập dự án

  1. Đăng nhập vào Google Cloud Console. Nếu bạn chưa có tài khoản Gmail hoặc Google Workspace, hãy tạo một tài khoản. Sử dụng tài khoản cá nhân thay vì tài khoản do nơi làm việc hoặc trường học cấp.
  1. Tạo dự án mới hoặc chọn dự án hiện có. Trong tiêu đề Google Cloud Console, hãy nhấp vào Chọn dự án, rồi nhấp vào Dự án mới.

Hộp thoại chọn dự án trong Google Cloud Console

Trong cửa sổ Chọn một dự án, hãy nhấp vào Dự án mới để mở hộp thoại tạo dự án.

Hộp thoại tạo dự án mới

Trong hộp thoại, hãy nhập Tên dự án rồi chọn tổ chức hoặc vị trí của bạn.

Trường nhập thông tin chi tiết về dự án

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Tên dự án không được các API của Google sử dụng và bạn có thể thay đổi tên này bất cứ lúc nào.
  • Mã dự án là duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi thiết lập). Google Cloud Console sẽ tự động tạo một mã nhận dạng duy nhất hoặc bạn có thể cung cấp mã nhận dạng của riêng mình. Trong lớp học lập trình này, bạn sẽ tham chiếu mã dự án bằng phần giữ chỗ .
  • Số dự án là giá trị nhận dạng thứ ba mà một số API sử dụng. Để biết thêm thông tin, hãy xem tài liệu về Resource Manager.

Bật tính năng thanh toán

Nếu thiết lập thông tin thanh toán bằng tín dụng Google Cloud, bạn có thể bỏ qua bước này.

Để thiết lập tài khoản thanh toán cá nhân, hãy bật tính năng thanh toán trong Cloud Console.

  • Việc hoàn thành bài tập này sẽ tốn ít hơn 5 USD cho các tài nguyên trên Google Cloud.
  • Hãy làm theo các bước dọn dẹp ở cuối bài thực hành này để xoá tài nguyên và tránh bị tính thêm phí.
  • Người dùng mới đủ điều kiện dùng thử miễn phí 300 USD.

Khởi động Cloud Shell

Trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên đám mây.

Trên bảng điều khiển Google Cloud, hãy nhấp vào biểu tượng Kích hoạt Cloud Shell trên thanh công cụ ở trên cùng bên phải:

Nút Kích hoạt Cloud Shell

Ngoài ra, hãy nhấn G rồi nhấn S hoặc mở Google Cloud Shell trực tiếp.

Khi được kết nối, Cloud Shell sẽ hiển thị lời nhắc của thiết bị đầu cuối:

Ảnh chụp màn hình cửa sổ dòng lệnh Google Cloud Shell

Cloud Shell có bộ nhớ liên tục và các công cụ phát triển. Bạn có thể chạy tất cả các bước trong lớp học lập trình này trên trình duyệt.

3. Bật API

Để sử dụng Google Kubernetes Engine (GKE) cho AlloyDB Omni và việc triển khai mô hình, hãy bật API Compute Engine và GKE trong dự án trên đám mây của bạn.

Trong Cloud Shell, hãy xác minh rằng bạn đã định cấu hình mã dự án:

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

Nếu bạn chưa xác định mã dự án, hãy định cấu hình mã dự án:

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

Bật các API bắt buộc:

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

Kết quả đầu ra dự kiến:

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.

Bạn có thể đọc về từng API đã bật trong tài liệu.

4. Triển khai AlloyDB Omni trên GKE

Để triển khai AlloyDB Omni trên GKE, hãy chuẩn bị một cụm Kubernetes theo các yêu cầu đối với toán tử AlloyDB Omni.

Tạo một cụm GKE

Triển khai một cụm GKE tiêu chuẩn có đủ dung lượng để chạy AlloyDB Omni, toán tử và các vùng chứa giám sát. AlloyDB Omni yêu cầu tối thiểu 2 CPU và 8 GB RAM. Hướng dẫn này sử dụng loại máy n2-standard-4.

Đặt các biến môi trường cho quá trình triển khai:

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

Tạo cụm GKE tiêu chuẩn:

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

Kết quả đầu ra dự kiến trên bảng điều khiển:

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

Chuẩn bị cụm

Cài đặt các thành phần bắt buộc như cert-manager, bộ điều khiển chứng chỉ gốc cho Kubernetes. Để biết thông tin chi tiết, hãy xem tài liệu cài đặt cert-manager.

Cloud Shell có công cụ dòng lệnh Kubernetes kubectl. Lấy thông tin đăng nhập cụm bằng cách sử dụng gcloud:

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

Cài đặt cert-manager bằng kubectl:

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

Kết quả đầu ra dự kiến trên bảng điều khiển (đã chỉnh sửa):

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

Cài đặt toán tử AlloyDB Omni

Cài đặt toán tử AlloyDB Omni bằng Helm.

Tải xuống và cài đặt biểu đồ toán tử AlloyDB Omni:

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

Kết quả đầu ra dự kiến trên bảng điều khiển (đã chỉnh sửa):

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

Triển khai cụm cơ sở dữ liệu.

Tệp kê khai sau đây định cấu hình một cụm cơ sở dữ liệu có googleMLExtension được bật và một bộ cân bằng tải nội bộ:

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

Giá trị bí mật của mật khẩu là biểu thị Base64 của VeryStrongPassword. Trong môi trường phát hành chính thức, hãy sử dụng Google Secret Manager để quản lý mật khẩu. Để biết thông tin chi tiết, hãy xem tài liệu về Secret Manager.

Tệp kê khai được lưu dưới dạng my-omni.yaml. Trong Cloud Shell, hãy nhấp vào Mở trình chỉnh sửa ở góc trên cùng bên phải của cửa sổ thiết bị đầu cuối rồi đọc tệp.

Mở Trình chỉnh sửa trong Cloud Shell

Sau khi đọc tệp kê khai my-omni.yaml, hãy nhấp vào Open Terminal (Mở cửa sổ dòng lệnh) để quay lại dấu nhắc lệnh.

Mở cửa sổ lệnh Terminal trong Cloud Shell

Áp dụng tệp kê khai my-omni.yaml:

kubectl apply -f my-omni.yaml

Kết quả đầu ra dự kiến trên bảng điều khiển:

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

Kiểm tra trạng thái của cụm my-omni:

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

Trong quá trình triển khai, cụm cơ sở dữ liệu sẽ chuyển đổi qua các giai đoạn thiết lập cho đến khi đạt được trạng thái DBClusterReady.

Kết quả đầu ra dự kiến trên bảng điều khiển:

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

Bạn có thể giám sát việc triển khai cụm bằng lệnh kubectl log (không bắt buộc):

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

Kết nối với AlloyDB Omni

Khi cụm đã sẵn sàng, hãy kết nối với nhóm cơ sở dữ liệu bằng ứng dụng PostgreSQL (psql). Mật khẩu là VeryStrongPassword như được xác định trong 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

Ví dụ về thông tin xuất trên bảng điều khiển:

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

postgres=#

Thoát khỏi phiên psql bằng cách nhập \q rồi nhấn Enter:

postgres=# \q

5. Triển khai mô hình EmbeddingGemma trên GKE

Để kiểm thử việc tích hợp AI AlloyDB Omni với các mô hình cục bộ, hãy triển khai một mô hình nhúng vào cụm GKE. Hướng dẫn này sử dụng mô hình EmbeddingGemma của Google.

Tạo một bộ nút cho mô hình

Để chạy suy luận mô hình, hãy chuẩn bị một bộ nút chuyên dụng. Bạn có thể sử dụng một bộ nút chỉ có CPU hoặc một bộ nút được tăng tốc bằng GPU (chẳng hạn như g2-standard-8 có GPU NVIDIA L4). Hướng dẫn này sử dụng một bộ nút dựa trên CPU với các loại máy c3-standard-8.

Tạo một bộ nút CPU một nút:

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

Kết quả đầu ra dự kiến:

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

Lấy mã thông báo Hugging Face

Hướng dẫn này triển khai mô hình EmbeddingGemma từ Hugging Face. Để truy cập vào trọng số mô hình, hãy tạo một mã truy cập Hugging Face:

  1. Đăng nhập hoặc tạo tài khoản trên Hugging Face.
  2. Chuyển đến Hồ sơ của bạn > Mã truy cập.
  3. Nhấp vào Tạo mã thông báo mới.
  4. Nhập tên cho mã thông báo và chọn vai trò Đọc.
  5. Nhấp vào Tạo mã thông báo rồi sao chép giá trị mã thông báo đã tạo.
  6. Chấp nhận các điều khoản về mô hình trên trang mô hình EmbeddingGemma nếu bạn chưa làm việc này trước đây.

Tạo một khoá bí mật Kubernetes chứa mã thông báo Hugging Face của bạn trong Cloud Shell (thay thế phần giữ chỗ mã thông báo bằng mã thông báo của bạn):

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

Chuẩn bị tệp kê khai triển khai

Để triển khai mô hình, hãy sử dụng gói vùng chứa Suy luận nhúng văn bản (TEI) của Hugging Face. Để biết thêm thông tin, hãy xem tài liệu về Hugging Face GKE TEI.

Sao chép kho lưu trữ triển khai trên GitHub:

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

Kiểm tra và sửa đổi tệp kê khai cấu hình CPU:

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

Tệp kê khai đã cập nhật cho việc triển khai CPU:

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

Lưu các thay đổi bằng cách nhấn ctrl+s rồi chuyển về thiết bị đầu cuối.

Triển khai mô hình

Áp dụng tệp kê khai để triển khai máy chủ TEI:

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

Theo dõi quá trình triển khai cho đến khi quá trình này ở trạng thái sẵn sàng:

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

Kiểm tra dịch vụ tei-service Kubernetes:

kubectl get service tei-service

Kết quả đầu ra dự kiến:

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

Dịch vụ CLUSTER-IP xử lý các yêu cầu nội bộ tại http://34.118.233.48:8080/embed.

Kiểm thử điểm cuối mô hình cục bộ bằng cách sử dụng kubectl port-forward:

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

Mở thẻ Cloud Shell thứ hai bằng cách nhấp vào + ở đầu cửa sổ dòng lệnh:

Thêm thẻ Cloud Shell

Trong thẻ mới, hãy kiểm thử việc tạo mục nhúng bằng curl:

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

Kết quả đầu ra dự kiến (mảng vectơ):

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

Dừng chuyển tiếp cổng trong thẻ đầu tiên bằng cách nhấn ctrl+c.

6. Đăng ký mô hình nhúng trong AlloyDB Omni

Để sử dụng mô hình đã triển khai từ AlloyDB Omni, hãy tạo một cơ sở dữ liệu, xác định các hàm biến đổi và đăng ký điểm cuối của mô hình.

Tạo một máy ảo và cơ sở dữ liệu của ứng dụng

Tạo một phiên bản máy ảo Compute Engine trong cùng một VPC để đóng vai trò là máy chủ chuyển tiếp của ứng dụng:

Sơ đồ cấu trúc mạng cho thấy máy ảo của ứng dụng và AlloyDB Omni

Trong Cloud Shell, hãy tạo máy ảo khách hàng:

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

Truy xuất IP điểm cuối AlloyDB Omni:

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

Kết quả đầu ra dự kiến:

INSTANCE_IP=10.128.0.33

Giá trị INSTANCE_IP là IP của trình cân bằng tải nội bộ cho cụm AlloyDB Omni. Trong ví dụ này, đó là 10.131.0.33.

Kết nối với phiên bản máy ảo bằng SSH:

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

Trong phiên SSH trên instance-1, hãy cài đặt ứng dụng PostgreSQL:

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

Xuất IP của trình cân bằng tải AlloyDB Omni (thay thế bằng IP PRIMARYENDPOINT của bạn):

export INSTANCE_IP=10.131.0.33

Kết nối với AlloyDB Omni bằng psql (mật khẩu là VeryStrongPassword):

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

Trong phiên psql, hãy tạo cơ sở dữ liệu demo:

CREATE DATABASE demo;

Chuyển sang cơ sở dữ liệu demo:

\c demo

Tạo hàm biến đổi

Các điểm cuối nhúng tuỳ chỉnh yêu cầu các hàm biến đổi đầu vào và đầu ra để điều chỉnh định dạng dữ liệu giữa AlloyDB Omni và API mô hình.

Tạo hàm biến đổi dữ liệu đầu vào:

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

Kết quả đầu ra dự kiến:

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

Tạo hàm biến đổi đầu ra để phân tích cú pháp phản hồi mảng vectơ:

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

Kết quả đầu ra dự kiến:

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

Đăng ký mô hình

Đăng ký mô hình trong AlloyDB Omni bằng quy trình google_ml.create_model. Chỉ định http://tei-service:8080/embed làm model_request_url để định tuyến các yêu cầu đến dịch vụ cụm Kubernetes:

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');

Kết quả đầu ra dự kiến:

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

Kiểm thử mô hình đã đăng ký bằng một truy vấn SQL mẫu:

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

Hàm này trả về biểu diễn mảng số thực do mô hình EmbeddingGemma cục bộ chạy trên GKE tạo.

Nhấn q để quay lại lời nhắc về phiên psql.

Thoát khỏi phiên psql:

\q

7. Kiểm thử mô hình bằng dữ liệu mẫu

Tải dữ liệu mẫu

Hướng dẫn này sử dụng tập dữ liệu bán lẻ Cymbal để minh hoạ tính năng tìm kiếm tương tự theo vectơ. Bạn sẽ sử dụng Google Cloud SDK và ứng dụng PostgreSQL để nhập dữ liệu vào AlloyDB Omni.

Trong phiên SSH trên instance-1, hãy kết nối với cơ sở dữ liệu minh hoạ và bật tiện ích vector:

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

Trong phiên psql:

CREATE EXTENSION IF NOT EXISTS vector;

Thoát khỏi phiên psql:

\q

Tải giản đồ xuống và áp dụng giản đồ đó để tạo bảng trong cơ sở dữ liệu demo:

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

Kết quả đầu ra dự kiến:

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

Xác minh các bảng đã tạo:

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

Kết quả đầu ra dự kiến:

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)

Tải dữ liệu vào bảng 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"

Kết quả đầu ra dự kiến:

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

Dưới đây là mẫu của một vài hàng trong bảng 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"

Kết quả đầu ra dự kiến:

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

Tải dữ liệu vào bảng 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"

Kết quả đầu ra dự kiến:

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

Dưới đây là mẫu của một vài hàng trong bảng cymbal_inventory.

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

Kết quả:

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

Tải dữ liệu vào bảng 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"

Kết quả đầu ra dự kiến trên bảng điều khiển:

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

Sau đây là mẫu của một vài hàng trong bảng cymbal_stores.

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

Kết quả:

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

Tạo các vectơ nhúng

Kết nối với cơ sở dữ liệu minh hoạ bằng psql và tạo các mục nhúng cho những sản phẩm được mô tả trong bảng cymbal_products dựa trên nội dung mô tả sản phẩm.

Kết nối với cơ sở dữ liệu minh hoạ:

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

Sử dụng cột embedding thuộc loại vector để lưu trữ các vectơ nhúng văn bản được tạo cho nội dung mô tả sản phẩm.

Bật tính năng đo thời gian truy vấn:

\timing

Tạo các mục nhúng cho từng nội dung mô tả sản phẩm và lưu trữ các mục đó trong bảng cymbal_embedding:

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

Kết quả đầu ra dự kiến:

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

Chạy truy vấn tìm kiếm ngữ nghĩa

Trong phiên psql, hãy tìm 5 sản phẩm hàng đầu phù hợp với câu hỏi "What kind of fruit trees grow well here?" bằng cách sử dụng khoảng cách cosine (<=>):

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

Kết quả đầu ra dự kiến:

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

Time: 83.610 ms
demo=#

Truy vấn chạy 83 mili giây và trả về danh sách các cây từ bảng cymbal_products khớp với yêu cầu và có hàng tồn kho tại cửa hàng có số 1583.

Tạo chỉ mục ANN

Với một tập dữ liệu nhỏ, bạn có thể dễ dàng sử dụng tính năng tìm kiếm chính xác để quét tất cả các mục nhúng. Tuy nhiên, khi dữ liệu tăng lên, thời gian tải và phản hồi cũng tăng theo. Để cải thiện hiệu suất, bạn có thể tạo chỉ mục trên dữ liệu nhúng. Dưới đây là ví dụ về cách thực hiện bằng cách sử dụng chỉ mục ScaNN của Google cho dữ liệu vectơ.

Kết nối lại với cơ sở dữ liệu minh hoạ nếu bạn bị mất kết nối:

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

Bật tiện ích alloydb_scann:

CREATE EXTENSION IF NOT EXISTS alloydb_scann;

Tạo chỉ mục ScaNN trên cột embedding:

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

Chạy lại cụm từ tìm kiếm ngữ nghĩa để so sánh hiệu suất thực thi:

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

Kết quả đầu ra dự kiến:

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

Time: 64.783 ms

Thời gian thực thi truy vấn đã giảm nhẹ và mức tăng sẽ rõ rệt hơn với các tập dữ liệu lớn hơn. Dữ liệu trả về phải giống hoặc rất giống với dữ liệu chúng ta nhận được mà không có chỉ mục.

Hãy thử các truy vấn khác và đọc thêm về cách tối ưu hoá chỉ mục vectơ trong tài liệu.

Thoát khỏi phiên psql:

\q

Quay lại Google Cloud Shell bằng cách ngắt kết nối khỏi phiên instance-1 ssh bằng cách nhấn tổ hợp phím CTRL+D hoặc nhập exit.

8. Triển khai Gemma bằng vLLM

Thêm bộ nút cho Gemma

Trước tiên, hãy kiểm tra xem những loại nút nào có ở khu vực của bạn:

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

Bạn sẽ thấy danh sách các loại bộ tăng tốc có sẵn, bao gồm cả bộ tăng tốc nvidia-l4. Bây giờ, hãy tạo một bộ nút có loại trình tăng tốc 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

Tạo tệp kê khai triển khai cho mô hình Google Gemini 4 12B bằng vLLM:

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

Áp dụng chế độ triển khai gemma-12b-gpu-vllm-deployment.yaml đã lưu:

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

Kết quả đầu ra dự kiến:

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

Chờ cho đến khi quá trình triển khai hoàn tất và mô hình được tải. Quá trình này có thể mất vài phút.

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

Kết quả đầu ra dự kiến:

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

Kiểm thử mô hình. Bật tính năng chuyển tiếp cổng để truy cập vào mô hình:

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

Trong một cửa sổ dòng lệnh khác, hãy dùng curl để gửi câu lệnh đến mô hình:

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

Kết quả đầu ra dự kiến:

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

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

Here is a breakdown of what makes it significant:

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

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

Dừng chuyển tiếp cổng trong thiết bị đầu cuối đầu tiên (nếu thiết bị này vẫn đang chạy) bằng cách nhấn Ctrl+C.

9. Đăng ký mô hình Gemma 4 trong AlloyDB Omni

Đăng ký mô hình Gemma 12B trong AlloyDB Omni bằng quy trình google_ml.create_model. Chỉ định http://gemma-12b-gpu-vllm-service:8000/v1/chat/completions làm model_request_url để định tuyến các yêu cầu đến dịch vụ cụm Kubernetes:

Truy xuất IP điểm cuối AlloyDB Omni:

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

Kết nối với phiên bản máy ảo bằng SSH:

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

Sau khi kết nối với VM, hãy xuất biến INSTANCE_IP từ bước trước (giá trị 10.128.0.33 được đưa ra làm ví dụ – hãy thay thế bằng IP của bạn):

export INSTANCE_IP=10.128.0.33

Xuất mật khẩu AlloyDB:

export PGPASSWORD=VeryStrongPassword

Kết nối với cơ sở dữ liệu demo:

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

Trong phiên psql, hãy đăng ký mô hình:

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

Kiểm tra mô hình với một truy vấn SQL mẫu:

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

Nhấn q để thoát khỏi cửa sổ kết quả và quay lại lời nhắc psql

Kết hợp tính năng tìm kiếm vectơ với RAG LLM trong AlloyDB Omni

Sử dụng tính năng tìm kiếm vectơ với yêu cầu LLM để minh hoạ RAG (Tạo sinh tăng cường truy xuất) bằng LLM.

Chạy truy vấn SQL trong PL/SQL:

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

Kết quả đầu ra dự kiến:

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

Cụm từ tìm kiếm bổ sung cho câu lệnh đối với LLM bằng kết quả tìm kiếm vectơ.

Hãy thử các truy vấn khác và thử nghiệm với các mẫu RAG. Ưu điểm của kiến ​​trúc được trình bày là tính tự cung tự cấp hoàn toàn. Dữ liệu không được gửi ra bên ngoài cụm của bạn và có thể chạy trong các môi trường hoàn toàn biệt lập.

Thoát khỏi phiên psql:

\q

Ngắt kết nối khỏi phiên SSH đến máy ảo:

exit

Đừng quên rằng AlloyDB Omni có nhiều tính năng và phòng thí nghiệm hơn.

10. Làm sạch môi trường

Để tránh phát sinh phí định kỳ cho tài khoản Google Cloud của bạn, hãy xóa các tài nguyên đã tạo trong bài hướng dẫn này.

Xóa cụm GKE

Trong Cloud Shell, hãy xóa cụm GKE:

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

Kết quả đầu ra dự kiến:

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

Xoá VM ứng dụng

Trong Cloud Shell, hãy xoá phiên bản Compute Engine:

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

Kết quả đầu ra dự kiến:

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

Nếu bạn đã tạo một dự án mới cho bài thực hành này, bạn có thể tùy chọn xóa toàn bộ dự án trong Google Cloud Resource Manager.

11. Xin chúc mừng

Chúc mừng bạn đã hoàn thành lớp học lập trình này!

Nội dung bạn đã đề cập

  • Cách triển khai AlloyDB Omni trên một cụm GKE
  • Cách kết nối với AlloyDB Omni
  • Cách tải dữ liệu vào AlloyDB Omni
  • Cách triển khai các mô hình AI (mô hình nhúng và mô hình ngôn ngữ lớn) vào GKE
  • Cách đăng ký mô hình AI trong AlloyDB Omni
  • Cách tạo các vectơ nhúng cho tính năng tìm kiếm ngữ nghĩa
  • Cách chạy các truy vấn tìm kiếm ngữ nghĩa trong AlloyDB Omni
  • Cách tạo và sử dụng chỉ mục vectơ trong AlloyDB Omni

Bạn có thể đọc thêm về cách làm việc với AI trong AlloyDB Omni trong tài liệu.

Khảo sát

Kết quả:

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ đọc qua Đọc và hoàn thành bài tập