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 GKE và sử dụng AlloyDB Omni với mô hình nhúng mở được triển khai trong cùng một cụm Kubernetes. Việc triển khai mô hình bên cạnh thực thể cơ sở dữ liệu trong cùng một cụm GKE sẽ giúp giảm độ trễ và các phần phụ thuộc trên các dịch vụ của bên thứ ba. Ngoài ra, việc này có thể được yêu cầu theo các yêu cầu bảo mật khi dữ liệu không được rời khỏi tổ chức và không được phép sử dụng các dịch vụ của bên thứ ba.
Điều kiện tiên quyết
- Có kiến thức cơ bản về Google Cloud, bảng điều khiển
- Kỹ năng cơ bản về giao diện dòng lệnh và Cloud Shell
Kiến thức bạn sẽ học được
- Cách triển khai AlloyDB Omni trên cụm Google Kubernetes
- 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 mô hình nhúng mở cho GKE
- Cách đăng ký mô hình nhúng trong AlloyDB Omni
- Cách tạo nội dung nhúng cho tính năng tìm kiếm ngữ nghĩa
- Cách sử dụng các nội dung nhúng được tạo để tìm kiếm ngữ nghĩa trong AlloyDB Omni
- Cách tạo và sử dụng chỉ mục vectơ trong AlloyDB
Bạn cần có
- Tài khoản Google Cloud và Dự án Google Cloud
- Một trình duyệt web như Chrome hỗ trợ Google Cloud Console và Cloud Shell
2. Cách thiết lập và các yêu cầu
Thiết lập môi trường theo tốc độ của riêng bạn
- Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.
- Tên dự án là tên hiển thị cho người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn luôn có thể cập nhật thông tin này.
- Mã dự án là duy nhất trên tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là
PROJECT_ID
). Nếu không thích mã được tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử dùng email của riêng mình để xem có thể sử dụng hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ được giữ nguyên trong suốt thời gian diễn ra dự án. - Xin lưu ý rằng có một giá trị thứ ba là Mã dự án mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc tham gia lớp học lập trình này sẽ không tốn kém nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí sau khi hoàn tất hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.
Khởi động Cloud Shell
Mặc dù có thể điều khiển Google Cloud từ xa trên máy tính xách tay, nhưng 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.
Trong Bảng điều khiển Google Cloud, hãy nhấp vào biểu tượng Cloud Shell trên thanh công cụ trên cùng bên phải:
Quá trình cấp phép và kết nối với môi trường sẽ chỉ mất vài phút. Khi hoàn tất, bạn sẽ thấy như sau:
Máy ảo này được tải sẵn tất cả các công cụ phát triển mà bạn cần. Ứng dụng này cung cấp một thư mục gốc 5 GB ổn định và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất mạng và xác thực. Bạn có thể thực hiện tất cả công việc trong lớp học lập trình này trong một trình duyệt. Bạn không cần cài đặt gì cả.
3. Trước khi bắt đầu
Bật API
Kết quả:
Trong Cloud Shell, hãy đảm bảo bạn đã thiết lập mã dự án:
PROJECT_ID=$(gcloud config get-value project)
echo $PROJECT_ID
Nếu không được xác định trong cấu hình shell trên đám mây, hãy thiết lập bằng các lệnh sau
export PROJECT_ID=<your project>
gcloud config set project $PROJECT_ID
Bật tất cả các dịch vụ cần thiết:
gcloud services enable compute.googleapis.com
gcloud services enable container.googleapis.com
Kết quả 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.
4. Triển khai AlloyDB Omni trên GKE
Để triển khai AlloyDB Omni trên GKE, chúng ta cần chuẩn bị một cụm Kubernetes theo các yêu cầu được liệt kê trong các yêu cầu đối với toán tử AlloyDB Omni.
Tạo cụm GKE
Chúng ta cần triển khai một cụm GKE tiêu chuẩn có cấu hình nhóm đủ để triển khai một vùng chứa có thực thể AlloyDB Omni. Chúng ta cần ít nhất 2 CPU và 8 GB RAM cho Omni, cùng một số không gian cho các dịch vụ giám sát và điều hành.
Thiết lập các biến môi trường cho quá trình triển khai.
export PROJECT_ID=$(gcloud config get project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
export MACHINE_TYPE=e2-standard-4
Sau đó, chúng ta sử dụng gcloud để tạo cụm tiêu chuẩn 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
Kết quả đầu ra dự kiến trên bảng điều khiển:
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)$
Chuẩn bị cụm
Chúng ta cần cài đặt các thành phần bắt buộc như dịch vụ quản lý chứng chỉ. Chúng ta có thể làm theo các bước trong tài liệu để cài đặt cert-manager
Chúng ta sử dụng công cụ dòng lệnh Kubernetes, kubectl, đã được cài đặt trong Cloud Shell. Trước khi sử dụng tiện ích này, chúng ta cần lấy thông tin xác thực cho cụm của mình.
gcloud container clusters get-credentials ${CLUSTER_NAME} --region=${LOCATION}
Bây giờ, chúng ta có thể sử dụng kubectl để cài đặt cert-manager:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.2/cert-manager.yaml
Kết quả đầu ra dự kiến trên bảng điều khiển(đã loại bỏ):
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
Cài đặt AlloyDB Omni
Bạn có thể cài đặt toán tử AlloyDB Omni bằng tiện ích helm.
Chạy lệnh sau để cài đặt toán tử 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
Kết quả đầu ra dự kiến trên bảng điều khiển(đã loại bỏ):
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:~$
Khi cài đặt toán tử AlloyDB Omni, chúng ta có thể tiếp tục triển khai cụm cơ sở dữ liệu.
Dưới đây là ví dụ về tệp kê khai triển khai có tham số googleMLExtension đã bật và bộ cân bằng tải nội bộ (riêng tư).:
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
Giá trị bí mật cho mật khẩu là một chuỗi Base64 đại diện cho từ mật khẩu "VeryStrongPassword". Cách đáng tin cậy hơn là sử dụng trình quản lý bí mật của Google để lưu trữ giá trị mật khẩu. Bạn có thể đọc thêm về vấn đề này trong tài liệu.
Lưu tệp kê khai dưới dạng my-omni.yaml để áp dụng trong bước tiếp theo. Nếu đang ở Cloud Shell, bạn có thể thực hiện việc này bằng trình chỉnh sửa bằng cách nhấn nút "Open Editor" (Mở trình chỉnh sửa) ở trên cùng bên phải của thiết bị đầu cuối.
Sau khi lưu tệp có tên my-omni.yaml, hãy quay lại dòng lệnh bằng cách nhấn nút "Open Terminal" (Mở dòng lệnh).
Áp dụng tệp kê khai my-omni.yaml cho cụm bằng tiện ích kubectl:
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 bằng tiện ích kubectl:
kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default
Trong quá trình triển khai, cụm sẽ trải qua nhiều giai đoạn và cuối cùng sẽ kết thú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
Kết nối với AlloyDB Omni
Kết nối bằng Pod Kubernetes
Khi cụm đã sẵn sàng, chúng ta có thể sử dụng các tệp nhị phân ứng dụng PostgreSQL trên vùng chứa thực thể AlloyDB Omni. Chúng ta tìm mã nhận dạng của nhóm, sau đó sử dụng kubectl để kết nối trực tiếp với nhóm và chạy phần mềm ứng dụng. Mật khẩu là VeryStrongPassword được đặt thông qua hàm băm 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
Kết quả mẫu 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 (15.7) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off) Type "help" for help. postgres=#
5. Triển khai mô hình AI trên GKE
Để kiểm thử tính năng tích hợp AI OmniDB AlloyDB với các mô hình cục bộ, chúng ta cần triển khai một mô hình cho cụm.
Tạo nhóm nút cho mô hình
Để chạy mô hình, chúng ta cần chuẩn bị một nhóm nút để chạy quy trình suy luận. Phương pháp tốt nhất từ quan điểm hiệu suất là một nhóm có trình tăng tốc đồ hoạ sử dụng cấu hình nút như g2-standard-8 với trình tăng tốc Nvidia L4.
Tạo nhóm nút bằng trình tăng tốc 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
Kết quả 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 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
Chuẩn bị tệp kê khai triển khai
Để triển khai mô hình, chúng ta cần chuẩn bị tệp kê khai triển khai.
Chúng tôi đang sử dụng mô hình nhúng BGE Base v1.5 của Hugging Face. Bạn có thể đọc thẻ mô hình tại đây. Để triển khai mô hình, chúng ta có thể sử dụng hướng dẫn đã chuẩn bị sẵn của Hugging Face và gói triển khai trên GitHub.
Sao chép gói
git clone https://github.com/huggingface/Google-Cloud-Containers
Chỉnh sửa tệp kê khai bằng cách thay thế giá trị cloud.google.com/gke-accelerator bằng nvidia-l4 và thêm giới hạn vào tài nguyên.
vi Google-Cloud-Containers/examples/gke/tei-deployment/gpu-config/deployment.yaml
Sau đây là tệp kê khai đã sửa.
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
Triển khai mô hình
Chúng ta cần chuẩn bị một tài khoản dịch vụ và không gian tên để triển khai.
Tạo một không gian tên kubernetes hf-gke-namespace.
export NAMESPACE=hf-gke-namespace
kubectl create namespace $NAMESPACE
Tạo tài khoản dịch vụ kubernetes
export SERVICE_ACCOUNT=hf-gke-service-account
kubectl create serviceaccount $SERVICE_ACCOUNT --namespace $NAMESPACE
Triển khai mô hình
kubectl apply -f Google-Cloud-Containers/examples/gke/tei-deployment/gpu-config
Xác minh các bản triển khai
kubectl get pods
Xác minh dịch vụ mô hình
kubectl get service tei-service
Thông tin này sẽ cho thấy loại dịch vụ đang chạy ClusterIP
Kết quả mẫu:
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 cho dịch vụ là địa chỉ điểm cuối mà chúng ta sẽ sử dụng. Mô hình nhúng có thể phản hồi bằng URI http://34.118.233.48:8080/embed. Mã này sẽ được sử dụng sau khi bạn đăng ký mô hình trong AlloyDB Omni.
Chúng ta có thể kiểm thử bằng cách hiển thị ứng dụng đó bằng lệnh chuyển tiếp cổng kubectl.
kubectl port-forward service/tei-service 8080:8080
Tính năng chuyển tiếp cổng sẽ chạy trong một phiên Cloud Shell và chúng ta cần một phiên khác để kiểm thử tính năng này.
Mở một thẻ Cloud Shell khác bằng dấu "+" ở trên cùng.
Và chạy lệnh curl trong phiên shell mới.
curl http://localhost:8080/embed \
-X POST \
-d '{"inputs":"Test"}' \
-H 'Content-Type: application/json'
Hàm này sẽ trả về một mảng vectơ như trong kết quả mẫu sau (đã bị loại bỏ):
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. Đăng ký Mô hình trong AlloyDB Omni
Để kiểm thử cách AlloyDB Omni hoạt động với mô hình đã triển khai, chúng ta cần tạo một cơ sở dữ liệu và đăng ký mô hình.
Tạo cơ sở dữ liệu
Tạo một máy ảo GCE làm hộp chuyển đổi, kết nối với AlloyDB Omni từ máy ảo khách và tạo cơ sở dữ liệu.
Chúng ta cần hộp chuyển đổi vì bộ cân bằng tải bên ngoài GKE cho Omni cấp cho bạn quyền truy cập từ VPC bằng cách sử dụng địa chỉ IP riêng tư nhưng không cho phép bạn kết nối từ bên ngoài VPC. Nhìn chung, phương thức này an toàn hơn và không hiển thị thực thể cơ sở dữ liệu của bạn trên Internet. Vui lòng xem sơ đồ để biết rõ hơn.
Để tạo máy ảo trong phiên Cloud Shell, hãy thực thi:
export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE
Tìm IP điểm cuối AlloyDB Omni bằng kubectl trong Cloud Shell:
kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default
Ghi lại PRIMARYENDPOINT. Sau đây là một ví dụ.
đầu ra:
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 là địa chỉ IP mà chúng ta sẽ sử dụng trong các ví dụ để kết nối với thực thể AlloyDB Omni.
Kết nối với máy ảo bằng gcloud:
gcloud compute ssh instance-1 --zone=$ZONE
Nếu bạn được nhắc tạo khoá ssh, hãy làm theo hướng dẫn. Đọc thêm về kết nối ssh trong tài liệu.
Trong phiên ssh đến máy ảo, 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 như trong ví dụ sau (thay thế IP bằng IP của trình cân bằng tải):
export INSTANCE_IP=10.131.0.33
Kết nối với AlloyDB Omni, mật khẩu là VeryStrongPassword được đặt thông qua hàm băm trong my-omni.yaml:
psql "host=$INSTANCE_IP user=postgres sslmode=require"
Trong phiên psql đã thiết lập, hãy thực thi:
create database demo;
Thoát khỏi phiên và kết nối với bản minh hoạ cơ sở dữ liệu (hoặc bạn chỉ cần chạy "\c demo" trong cùng một phiên)
psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"
Tạo hàm biến đổi
Đối với các mô hình nhúng của bên thứ ba, chúng ta cần tạo các hàm biến đổi để định dạng dữ liệu đầu vào và đầu ra theo định dạng mà mô hình và các hàm nội bộ của chúng ta dự kiến.
Dưới đây là hàm biến đổi xử lý dữ liệu đầu vào:
-- 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;
$$;
Thực thi mã được cung cấp trong khi kết nối với cơ sở dữ liệu minh hoạ như trong kết quả mẫu:
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=#
Và đây là hàm đầu ra chuyển đổi phản hồi từ mô hình thành mảng số thực:
-- 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;
$$;
Thực thi trong cùng một phiê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=#
Đăng ký mô hình
Bây giờ, chúng ta có thể đăng ký mô hình trong cơ sở dữ liệu.
Dưới đây là lệnh gọi quy trình để đăng ký mô hình có tên bge-base-1.5, replace the IP 34.118.233.48 by your model service IP address (đầu ra từ 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');
Thực thi mã được cung cấp trong khi kết nối với cơ sở dữ liệu minh hoạ:
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=#
Chúng ta có thể kiểm thử mô hình đăng ký bằng truy vấn kiểm thử sau đây. Truy vấn này sẽ trả về một mảng số thực.
select google_ml.embedding('bge-base-1.5','What is AlloyDB Omni?');
7. Kiểm thử mô hình trong AlloyDB Omni
Tải dữ liệu
Để kiểm thử cách AlloyDB Omni hoạt động với mô hình đã triển khai, chúng ta cần tải một số dữ liệu. Tôi đã sử dụng cùng một dữ liệu như trong một trong các lớp học lập trình khác để tìm kiếm vectơ trong AlloyDB.
Một cách để tải dữ liệu là sử dụng SDK Google Cloud và phần mềm ứng dụng PostgreSQL. Chúng ta có thể sử dụng cùng một máy ảo ứng dụng dùng để tạo cơ sở dữ liệu minh hoạ. SDK Google Cloud phải được cài đặt ở đó nếu bạn đã sử dụng các tuỳ chọn mặc định cho hình ảnh máy ảo. Tuy nhiên, nếu đã sử dụng hình ảnh tuỳ chỉnh mà không có SDK của Google, bạn có thể thêm hình ảnh đó theo tài liệu.
Xuất IP của trình cân bằng tải AlloyDB Omni như trong ví dụ sau (thay thế IP bằng IP của trình cân bằng tải):
export INSTANCE_IP=10.131.0.33
Kết nối với cơ sở dữ liệu và bật tiện ích pgvector.
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 và trong phiên dòng lệnh, hãy thực thi các lệnh để tải dữ liệu vào cơ sở dữ liệu minh hoạ.
Tạo bảng:
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 trên bảng điều khiể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:~$
Dưới đây là danh sách các bảng đã tạo:
psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\dt+"
Kết quả:
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:~$
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 trên bảng điều khiể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ột số dòng mẫu 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ả:
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 trên bảng điều khiể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ột số dòng mẫu 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:~$
Dưới đây là một số dòng mẫu 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 phần 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 các sản phẩm được mô tả trong bảng cymbal_products dựa trên tên và 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"
Chúng ta đang sử dụng bảng cymbal_embedding có cột nhúng để lưu trữ các mục nhúng và chúng ta sử dụng nội dung mô tả sản phẩm làm dữ liệu đầu vào văn bản cho hàm.
Bật tính năng tính thời gian cho các truy vấn để so sánh sau với các mô hình từ xa.:
\timing
Chạy truy vấn để tạo các phần nhúng:
INSERT INTO cymbal_embedding(uniq_id,embedding) SELECT uniq_id, google_ml.embedding('bge-base-1.5',product_description)::vector FROM cymbal_products;
Kết quả đầu ra dự kiến trên bảng điều khiển:
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=#
Trong ví dụ này, việc tạo các mục nhúng cho 941 bản ghi mất khoảng 11 giây.
Chạy truy vấn kiểm thử
Kết nối với cơ sở dữ liệu minh hoạ bằng psql và bật tính năng tính thời gian để đo lường thời gian thực thi cho các truy vấn của chúng ta như chúng ta đã làm để tạo các mục nhúng.
Hãy tìm 5 sản phẩm hàng đầu phù hợp với một yêu cầu như "Cây ăn quả nào phát triển tốt ở đây?" bằng cách sử dụng khoảng cách cosine làm thuật toán cho tìm kiếm vectơ.
Trong phiên psql, hãy 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('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;
Kết quả đầu ra dự kiến trên bảng điều khiể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 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=#
Truy vấn này chạy trong 28 mili giây và trả về danh sách cây từ bảng cymbal_products khớp với yêu cầu và có khoảng không quảng cáo có sẵn trong cửa hàng với số 1583.
Tạo chỉ mục ANN
Khi chỉ có 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ả nội dung nhúng, nhưng khi dữ liệu tăng lên, thời gian tải và phản hồi cũng tăng lên. Để 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 việc này bằng chỉ mục Google ScaNN cho dữ liệu vectơ.
Kết nối lại với cơ sở dữ liệu minh hoạ nếu bạn đã 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:
CREATE INDEX cymbal_embedding_scann ON cymbal_embedding USING scann (embedding cosine);
Thử truy vấn giống như trước và so sánh kết quả:
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=#
Thời gian thực thi truy vấn đã giảm một chút và mức tăng đó sẽ rõ ràng hơn với các tập dữ liệu lớn hơn. Kết quả khá giống nhau và chỉ có Cherry được thay thế bằng Fremont Cottonwood.
Hãy thử các truy vấn khác và đọc thêm về cách chọn chỉ mục vectơ trong tài liệu.
Và đừng quên AlloyDB Omni có nhiều tính năng và phòng thí nghiệm hơn.
8. Dọn dẹp môi trường
Bây giờ, chúng ta có thể xoá cụm GKE bằng AlloyDB Omni và mô hình AI
Xoá cụm GKE
Trong Cloud Shell, hãy thực thi:
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}
Kết quả đầu ra dự kiến trên bảng điều khiể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á máy ảo
Trong Cloud Shell, hãy thực thi:
export PROJECT_ID=$(gcloud config get 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 trên bảng điều khiể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 đã tạo một dự án mới cho lớp học lập trình này, bạn có thể xoá toàn bộ dự án: https://console.cloud.google.com/cloud-resource-manager
9. 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 đã đề cập
- Cách triển khai AlloyDB Omni trên cụm Google Kubernetes
- 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 mô hình nhúng mở cho GKE
- Cách đăng ký mô hình nhúng trong AlloyDB Omni
- Cách tạo nội dung nhúng cho tính năng tìm kiếm ngữ nghĩa
- Cách sử dụng các nội dung nhúng được tạo để tìm kiếm ngữ nghĩa trong AlloyDB Omni
- Cách tạo và sử dụng chỉ mục vectơ trong AlloyDB
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.
10. Khảo sát
Kết quả: