‫AlloyDB Omni و EmbeddingGemma با Gemma 4 در Kubernetes

۱. مقدمه

در این codelab، با نحوه مستقر کردن AlloyDB Omni در Google Kubernetes Engine‏ (GKE) و استفاده از آن با مدل‌های باز مثل EmbeddingGemma و Gemma 4 برای جاسازی‌ها و پیش‌بینی‌ها آشنا خواهید شد. اجرای پایگاه داده و مدل‌ها در یک خوشه، تأخیر شبکه را کاهش می‌دهد و از وابستگی به سرویس‌های شخص ثالث جلوگیری می‌کند. این کار همچنین به برآورده کردن الزامات انطباق و اقامت داده کمک می‌کند زیرا داده‌های شما هرگز محیط شما را ترک نمی‌کند.

نمودار معماری AlloyDB Omni و EmbeddingGemma در GKE

پیش‌نیازها

  • درک اولیه از Google Cloud و کنسول Google Cloud
  • دانش پایه درباره Kubernetes و GKE
  • آشنایی با میانای خط فرمان و Google Cloud Shell

آنچه خواهید آموخت

  • نحوه مستقر کردن AlloyDB Omni در خوشه GKE
  • نحوه متصل شدن به AlloyDB Omni
  • نحوه بار کردن داده‌ها در AlloyDB Omni
  • نحوه مستقر کردن مدل‌های هوش مصنوعی (جاسازی و مدل زبانی بزرگ) در GKE
  • نحوه ثبت کردن مدل‌های هوش مصنوعی در AlloyDB Omni
  • نحوه تولید جاسازی برای جستجوی معنایی
  • نحوه اجرای پُرسمان‌های جستجوی معنایی در AlloyDB Omni
  • نحوه ایجاد کردن و استفاده کردن از نمایه‌های برداری در AlloyDB Omni

آنچه نیاز خواهید داشت

  • حساب Google Cloud و پروژه Google Cloud
  • مرورگر وب مانند Chrome

۲. راه‌اندازی و الزامات

راه‌اندازی پروژه

  1. به سیستم کنسول Google Cloud وارد شوید. اگر ازقبل حساب Gmail یا Google Workspace ندارید، حسابی ایجاد کنید. به‌جای حساب کاری یا تحصیلی، از حساب شخصی استفاده کنید.
  1. پروژه جدیدی ایجاد کنید یا پروژه موجودی را انتخاب کنید. در سرصفحه کنسول Google Cloud، روی انتخاب پروژه کلیک کنید، سپس روی پروژه جدید کلیک کنید.

کادر گفتگوی «انتخاب پروژه» در کنسول Google Cloud

در پنجره انتخاب پروژه، روی پروژه جدید کلیک کنید تا کادر گفتگوی ایجاد پروژه باز شود.

کادر گفتگوی ایجاد پروژه جدید

در کادر گفتگو، نام پروژه را وارد کنید و سازمان یا مکانتان را انتخاب کنید.

فیلدهای ورودی جزئیات پروژه

  • نام پروژه نام نمایشی برای شرکت‌کنندگان این پروژه است. نام پروژه توسط Google APIs استفاده نمی‌شود و می‌توانید آن را هرزمان خواستید تغییر دهید.
  • شناسه پروژه در همه پروژه‌های Google Cloud منحصربه‌فرد است و تغییرناپذیر است (نمی‌توانید آن را پس‌از تنظیم تغییر دهید). کنسول Google Cloud به‌طور خودکار شناسه یکتایی تولید می‌کند، یا می‌توانید شناسه خودتان را ارائه دهید. در این codelab، شناسه پروژه‌تان را با جای‌بان ارجاع می‌دهید.
  • شماره پروژه شناسه سومی است که برخی‌از میاناهای برنامه‌سازی کاربردی از آن استفاده می‌کنند. برای اطلاعات بیشتر، به اسناد Resource Manager مراجعه کنید.

فعال کردن صورت‌حساب

اگر صورت‌حساب را بااستفاده از اعتبارهای Google Cloud راه‌اندازی کرده‌اید، می‌توانید از این مرحله رد شوید.

برای راه‌اندازی حساب صورت‌حساب شخصی، صورت‌حساب را در کنسول Google Cloud فعال کنید.

  • تکمیل این آزمایشی کمتر از ۵ دلار امریکا در منابع Google Cloud هزینه دارد.
  • مراحل پاک‌سازی را در پایان این آزمایشگاه دنبال کنید تا منابع را حذف کنید و از هزینه‌های بیشتر جلوگیری کنید.
  • کاربران جدید واجدشرایط دوره آزمایشی رایگان ۳۰۰ دلاری هستند.

شروع Cloud Shell

در این codelab، از Google Cloud Shell استفاده می‌کنید که محیط خط فرمانی است که در فضای ابری اجرا می‌شود.

از کنسول Google Cloud، روی نماد فعال‌سازی Cloud Shell در نوارابزار بالا سمت چپ کلیک کنید:

دکمه فعال کردن Cloud Shell

یا کلید G و سپس S را فشار دهید، یا Google Cloud Shell را مستقیماً باز کنید.

وقتی متصل شد، Cloud Shell پیام‌واره پایانه را نمایش می‌دهد:

نماگرفت از پایانه Google Cloud Shell

Cloud Shell شامل فضای ذخیره‌سازی پایدار و ابزارهای توسعه است. می‌توانید همه مراحل این codelab را از مرورگرتان اجرا کنید.

۳. فعال کردن میاناهای برنامه‌سازی کاربردی

برای استفاده از Google Kubernetes Engine‏ (GKE) برای AlloyDB Omni و استقرار مدل، Compute Engine و GKE API را در پروژه Google Cloud خود فعال کنید.

در Cloud Shell، بررسی کنید که شناسه پروژه‌تان پیکربندی شده باشد:

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

اگر شناسه پروژه شما تعریف نشده است، آن را پیکربندی کنید:

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

میاناهای برنامه‌سازی کاربردی لازم را فعال کنید:

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

خروجی موردانتظار:

student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=test-project-001-402417
student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable compute.googleapis.com
gcloud services enable container.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

می‌توانید درباره هر API فعال‌شده در اسناد مطالعه کنید.

۴. مستقر کردن AlloyDB Omni در GKE

برای مستقر کردن AlloyDB Omni در GKE، یک خوشه Kubernetes را طبق الزامات اپراتور AlloyDB Omni آماده کنید.

ایجاد خوشه GKE

خوشه GKE خلبان خودکار را برای اجرای AlloyDB Omni، اپراتور، و پایش محفظه‌ها مستقر کنید. بااستفاده از خلبان خودکار، استقرار را ساده می‌کنیم - همه منابع برای اپراتور AlloyDB Omni، خوشه، و دیگر مؤلفه‌ها به‌طور خودکار اختصاص داده خواهند شد.

منطقه‌ای را که منابعتان را در آن مستقر می‌کنید انتخاب کنید. منطقه‌ای را انتخاب کنید که ازنظر جغرافیایی به مکان شما نزدیک باشد:

export LOCATION=<your region>

متغیرهای محیطی را برای استقرار خود تنظیم کنید:

export PROJECT_ID=$(gcloud config get-value project)
export CLUSTER_NAME=alloydb-ai-gke

خوشه GKE خلبان خودکار را ایجاد کنید:

gcloud container clusters create-auto ${CLUSTER_NAME} \
  --project=${PROJECT_ID} \
  --region=${LOCATION}

برونداد کنسول موردانتظار:

student@cloudshell:~ (test-project-001-402417)$ export PROJECT_ID=$(gcloud config get project)
export CLUSTER_NAME=alloydb-ai-gke
Your active configuration is: [test-project-001-402417]
student@cloudshell:~ (test-project-001-402417)$ gcloud container clusters create-auto ${CLUSTER_NAME} \
>   --project=${PROJECT_ID} \
>   --region=${LOCATION}
Creating cluster alloydb-ai-gke in us-east4... Cluster is being health-checked.
..⠹
Creating cluster alloydb-ai-gke in us-east4... Cluster is being health-checked
(Kubernetes Control Plane is healthy)...done.
Created [https://container.googleapis.com/v1/projects/gleb-genai-002/zones/us-east4/clusters/alloydb-ai-gke].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-east4/alloydb-ai-gke?project=gleb-genai-002
kubeconfig entry generated for alloydb-ai-gke.
NAME            LOCATION  MASTER_VERSION      MASTER_IP      MACHINE_TYPE   NODE_VERSION        NUM_NODES  STATUS   STACK_TYPE
alloydb-ai-gke  us-east4  1.36.4-gke.1391002  34.145.214.51  ek-standard-8  1.36.4-gke.1391002  3          RUNNING  IPV4

آماده کردن خوشه

اجزای لازم را نصب کنید، مثلاً cert-manager، کنترل‌کننده گواهینامه‌ها برای Kubernetes. برای جزئیات، به مستندات نصب cert-manager مراجعه کنید.

Cloud Shell شامل ابزار خط فرمان Kubernetes kubectl و helm است. بااستفاده از gcloud، اطلاعات کاربری خوشه را دریافت کنید:

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

نصب cert-manager بااستفاده از helm:

helm install \
  cert-manager oci://quay.io/jetstack/charts/cert-manager \
  --version v1.21.2 \
  --namespace cert-manager \
  --create-namespace \
  --set featureGates="ServerSideApply=true" \
  --set global.leaderElection.namespace=cert-manager \
  --set "extraArgs={--certificate-request-minimum-backoff-duration=15s,--certificate-request-maximum-backoff-duration=5m}" \
  --set crds.enabled=true

برونداد کنسول موردانتظار (ویرایش‌شده):

student@cloudshell:~$ elm install \
>   cert-manager oci://quay.io/jetstack/charts/cert-manager \
>   --version v1.21.2 \
>   --namespace cert-manager \
>   --create-namespace \
>  --set featureGates="ServerSideApply=true" \
>  --set global.leaderElection.namespace=cert-manager \
>  --set "extraArgs={--certificate-request-minimum-backoff-duration=15s,--certificate-request-maximum-backoff-duration=5m}" \
>   --set crds.enabled=true
Pulled: quay.io/jetstack/charts/cert-manager:v1.21.2
Digest: sha256:634dce9c13b56677a2c05e2ab76c312d0be2664022d5dd05815da67e1fd5f610
I1016 12:25:06.128464   30644 warnings.go:107] "Warning: autopilot-default-resources-mutator:Autopilot updated Deployment cert-manager/cert-manager-cainjector: defaulted unspecified 'cpu' resource for containers [cert-manager-cainjector] (see http://g.co/gke/autopilot-defaults)."
I1016 12:25:06.129972   30644 warnings.go:107] "Warning: autopilot-default-resources-mutator:Autopilot updated Deployment cert-manager/cert-manager: defaulted unspecified 'cpu' resource for containers [cert-manager-controller] (see http://g.co/gke/autopilot-defaults)."
I1016 12:25:06.134580   30644 warnings.go:107] "Warning: autopilot-default-resources-mutator:Autopilot updated Deployment cert-manager/cert-manager-webhook: defaulted unspecified 'cpu' resource for containers [cert-manager-webhook] (see http://g.co/gke/autopilot-defaults)."
I1016 12:25:06.250590   30644 warnings.go:107] "Warning: AdmissionWebhookController: mutated namespaceselector of the webhooks to enforce GKE Autopilot policies."
I1016 12:25:09.758249   30644 warnings.go:107] "Warning: autopilot-default-resources-mutator:Autopilot updated Job cert-manager/cert-manager-startupapicheck: defaulted unspecified 'cpu' resource for containers [cert-manager-startupapicheck] (see http://g.co/gke/autopilot-defaults)."
NAME: cert-manager
LAST DEPLOYED: Fri Oct 16 12:24:57 2026
NAMESPACE: cert-manager
STATUS: deployed
REVISION: 1
DESCRIPTION: Install complete
TEST SUITE: None
NOTES:
cert-manager v1.21.2 has been deployed successfully!

نصب کردن اپراتور AlloyDB Omni

اپراتور AlloyDB Omni را بااستفاده از Helm نصب کنید.

نمودار اپراتور AlloyDB Omni را بارگیری و نصب کنید:

helm install alloydbomni-operator oci://gcr.io/alloydb-omni/alloydbomni-operator \
--version 1.9.0 \
--create-namespace \
--namespace alloydb-omni-system \
$(helm install --help | grep -q -- '--rollback-on-failure' && echo '--rollback-on-failure' || echo '--atomic') \
--timeout 5m

برونداد کنسول موردانتظار (ویرایش‌شده):

student@cloudshell:~$ helm install alloydbomni-operator oci://gcr.io/alloydb-omni/alloydbomni-operator \
> --version 1.9.0 \
> --create-namespace \
> --namespace alloydb-omni-system \
> $(helm install --help | grep -q -- '--rollback-on-failure' && echo '--rollback-on-failure' || echo '--atomic') \
> --timeout 5m

Pulled: gcr.io/alloydb-omni/alloydbomni-operator:1.9.0
Digest: sha256:4f6cc3f0c1fbe003ab7d0119afee516e5c67ec950cd2909b418e5a3f6f09d1f6
I1016 12:28:50.088533   30982 warnings.go:107] "Warning: autopilot-default-resources-mutator:Autopilot updated Deployment alloydb-omni-system/fleet-controller-manager: adjusted 'cpu' resource to meet requirements for containers [fleet-manager] (see http://g.co/gke/autopilot-defaults)."
I1016 12:28:50.092917   30982 warnings.go:107] "Warning: autopilot-default-resources-mutator:Autopilot updated Deployment alloydb-omni-system/local-controller-manager: adjusted 'cpu' resource to meet requirements for containers [local-manager] (see http://g.co/gke/autopilot-defaults)."
I1016 12:28:50.229717   30982 warnings.go:107] "Warning: AdmissionWebhookController: mutated namespaceselector of the webhooks to enforce GKE Autopilot policies."
I1016 12:28:50.238578   30982 warnings.go:107] "Warning: AdmissionWebhookController: mutated namespaceselector of the webhooks to enforce GKE Autopilot policies."
NAME: alloydbomni-operator
LAST DEPLOYED: Fri Oct 16 12:28:45 2026
NAMESPACE: alloydb-omni-system
STATUS: deployed
REVISION: 1
DESCRIPTION: Install complete
TEST SUITE: None

خوشه پایگاه داده را مستقر کنید.

مانیفست زیر خوشه پایگاه داده را با googleMLExtension فعال‌شده و متعادل‌کننده بار داخلی پیکربندی می‌کند:

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.4.0"
  primarySpec:
    adminUser:
      passwordRef:
        name: db-pw-my-omni
    features:
      googleMLExtension:
        enabled: true
    resources:
      cpu: 1
      memory: 8Gi
      disks:
      - name: DataDisk
        size: 20Gi
    dbLoadBalancerOptions:
      annotations:
        networking.gke.io/load-balancer-type: "internal"
  allowExternalIncomingTraffic: true
EOF

مقدار رمز گذرواژه نمایش Base64 از VeryStrongPassword است. در محیط‌های تولید، از Google Secret Manager برای مدیریت گذرواژه‌ها استفاده کنید. برای جزئیات، به اسناد Secret Manager مراجعه کنید.

مانیفست به‌صورت my-omni.yaml ذخیره می‌شود. در Cloud Shell، روی باز کردن ویرایشگر در گوشه بالا سمت چپ پنجره پایانه کلیک کنید و فایل را بخوانید.

باز کردن ویرایشگر در Cloud Shell

پس‌از خواندن مانیفست my-omni.yaml، روی باز کردن پایانه کلیک کنید تا به اعلان فرمان برگردید.

باز کردن پایانه در Cloud Shell

مانیفست my-omni.yaml را اعمال کنید:

kubectl apply -f my-omni.yaml

برونداد کنسول موردانتظار:

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

وضعیت خوشه my-omni را بررسی کنید:

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

درطول استقرار، خوشه پایگاه داده مراحل راه‌اندازی را طی می‌کند تا به وضعیت DBClusterReady برسد.

برونداد کنسول موردانتظار:

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

درصورت تمایل می‌توانید بااستفاده از فرمان kubectl log، بر استقرار خوشه نظارت کنید:

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

اتصال به AlloyDB Omni

وقتی خوشه آماده شد، بااستفاده از کلاینت PostgreSQL (psql) به پاد پایگاه داده متصل شوید. گذرواژه 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 (18.4)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off, ALPN: postgresql)
Type "help" for help.

postgres=#

با تایپ کردن \q و فشار دادن کلید Enter، از جلسه psql خارج شوید:

postgres=# \q

۵. مستقر کردن مدل EmbeddingGemma در GKE

برای آزمایش کردن ادغام AlloyDB Omni AI با مدل‌های محلی، یک مدل جاسازی را در خوشه GKE مستقر کنید. این آموزش از مدل EmbeddingGemma از Google استفاده می‌کند.

دریافت کردن کد Hugging Face

این آموزش مدل EmbeddingGemma را از Hugging Face مستقر می‌کند. برای دسترسی به وزن‌های مدل، کد دسترسی Hugging Face تولید کنید:

  1. به سیستم حساب Hugging Face وارد شوید یا حسابی ایجاد کنید.
  2. به نمایه شما > کدهای دسترسی پیمایش کنید.
  3. روی ایجاد کردن کد جدید کلیک کنید.
  4. نامی برای کد وارد کنید و نقش خواندن را انتخاب کنید.
  5. روی ایجاد کردن کد کلیک کنید و مقدار کد تولیدشده را کپی کنید.
  6. اگر قبلاً شرایط مدل را در صفحه مدل EmbeddingGemma نپذیرفته‌اید، اکنون بپذیرید.

یک کلید Kubernetes حاوی کد Hugging Face خود در Cloud Shell ایجاد کنید (جای‌بان کد را با کد خود جایگزین کنید):

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 -

آماده‌سازی مانیفست استقرار

برای استقرار مدل، از بسته محفظه Text Embeddings Inference (TEI) در Hugging Face استفاده کنید. برای اطلاعات بیشتر، به اسناد Hugging Face GKE TEI مراجعه کنید.

همسانه‌سازی کردن مخزن استقرار از GitHub:

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

مانیفست پیکربندی CPU را بررسی و اصلاح کنید:

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

مانیفست به‌روزشده برای استقرار 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"

با فشار دادن ctrl+s، تغییرات را ذخیره کنید و به پایانه برگردید.

مستقر کردن مدل

مانیفست را برای پیاده‌سازی سرور TEI اعمال کنید:

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

استقرار را تا زمانی که در وضعیت آماده قرار گیرد پایش کنید:

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'

سرویس Kubernetes‏ tei-service را بررسی کنید:

kubectl get service tei-service

خروجی موردانتظار:

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 درخواست‌ها را به‌طور داخلی در http://34.118.233.48:8080/embed ارائه می‌دهد.

نقطه پایانی مدل را به‌طور محلی بااستفاده از kubectl port-forward آزمایش کنید:

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

با کلیک کردن روی + در بالای پایانه، برگه Cloud Shell دومی را باز کنید:

افزودن برگه Cloud Shell

در برگه جدید، تولید جاسازی را با curl آزمایش کنید:

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

با فشار دادن ctrl+c، بازارسال درگاه را در برگه اول متوقف کنید.

‫۶. ثبت کردن مدل جاسازی در AlloyDB Omni

برای استفاده از مدل مستقرشده از AlloyDB Omni، پایگاه داده‌ای ایجاد کنید، توابع تبدیل را تعریف کنید، و نقطه پایانی مدل را ثبت کنید.

ایجاد ماشین مجازی کارخواه و پایگاه داده

نمونه ماشین مجازی Compute Engine در همان VPC ایجاد کنید تا به‌عنوان میزبان پرش کارخواه عمل کند:

نمودار معماری شبکه که ماشین مجازی کارخواه و AlloyDB Omni را نشان می‌دهد

در Cloud Shell، ماشین مجازی کارخواه را ایجاد کنید:

export ZONE=${LOCATION}-a
gcloud compute instances create instance-1 \
  --zone=$ZONE

بازیابی IP نقطه پایانی AlloyDB Omni:

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

خروجی موردانتظار:

INSTANCE_IP=10.128.0.33

مقدار INSTANCE_IP نشانی IP ترازکننده بار داخلی برای خوشه AlloyDB Omni است. در این مثال، 10.131.0.33 است.

بااستفاده از SSH به نمونه VM متصل شوید:

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

در جلسه SSH در instance-1، کارخواه PostgreSQL را نصب کنید:

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

نشانی IP توازن‌گر بار AlloyDB Omni را صادر کنید (با نشانی IP PRIMARYENDPOINT خودتان جایگزین کنید):

export INSTANCE_IP=10.131.0.33

بااستفاده از psql به AlloyDB Omni متصل شوید (گذرواژه VeryStrongPassword است):

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

در جلسه psql، پایگاه داده demo را ایجاد کنید:

CREATE DATABASE demo;

به پایگاه داده demo بروید:

\c demo

ایجاد توابع تبدیل

نقاط پایانی جاسازی سفارشی به توابع تبدیل ورودی و خروجی نیاز دارند تا قالب‌های داده را بین AlloyDB Omni و میانای برنامه‌سازی کاربردی مدل تطبیق دهند.

تابع تبدیل ورودی را ایجاد کنید:

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

خروجی موردانتظار:

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

تابع تبدیل خروجی را برای تجزیه پاسخ آرایه برداری ایجاد کنید:

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

ثبت مدل

مدل را بااستفاده از رویه google_ml.create_model در AlloyDB Omni ثبت کنید. http://tei-service:8080/embed را به‌عنوان model_request_url برای مسیریابی درخواست‌ها به سرویس خوشه 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');

خروجی موردانتظار:

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

مدل ثبت‌شده را با پُرسمان SQL نمونه آزمایش کنید:

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

این تابع نمایش آرایه اعداد حقیقی را که توسط مدل EmbeddingGemma محلی درحال اجرا در GKE تولید شده است برمی‌گرداند.

برای برگشتن به پیام‌واره جلسه psql، q را فشار دهید.

از جلسه psql خارج شوید:

\q

‫۷. آزمایش کردن مدل با داده‌های نمونه

بار کردن داده‌های نمونه‌گیری‌شده

این آموزش گام‌به‌گام از مجموعه داده خرده‌فروشی Cymbal برای نمایش جستجوی شباهت برداری استفاده می‌کند. برای وارد کردن داده‌ها به AlloyDB Omni، از Google Cloud SDK و کارخواه PostgreSQL استفاده خواهید کرد.

در جلسه «پوسته ایمن» در instance-1، به پایگاه داده نمایشی متصل شوید و افزونه vector را فعال کنید:

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

در جلسه psql:

CREATE EXTENSION IF NOT EXISTS vector;

از جلسه psql خارج شوید:

\q

طرح‌واره را بارگیری و اعمال کنید تا جدول‌ها در پایگاه داده demo ایجاد شود:

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)

بار کردن داده‌ها در جدول cymbal_products:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_products from stdin csv header"

خروجی موردانتظار:

student@cloudshell:~$ gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_products from stdin csv header"
COPY 941
student@cloudshell:~$ 

در اینجا نمونه‌ای از چند ردیف از جدول cymbal_products آورده شده است.

psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT uniq_id,left(product_name,30),left(product_description,50),sale_price FROM cymbal_products limit 3"

خروجی موردانتظار:

student@cloudshell:~$ psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT uniq_id,left(product_name,30),left(product_description,50),sale_price FROM cymbal_products limit 3"
Password for user postgres: 
             uniq_id              |              left              |                        left                        | sale_price 
----------------------------------+--------------------------------+----------------------------------------------------+------------
 a73d5f754f225ecb9fdc64232a57bc37 | Laundry Tub Strainer Cup       |   Laundry tub strainer cup Chrome For 1-.50, drain |      11.74
 41b8993891aa7d39352f092ace8f3a86 | LED Starry Star Night Light La |  LED Starry Star Night Light Laser Projector 3D Oc |      46.97
 ed4a5c1b02990a1bebec908d416fe801 | Surya Horizon HRZ-1060 Area Ru |  The 100% polypropylene construction of the Surya  |       77.4
(3 rows)
student@cloudshell:~$ 

بار کردن داده‌ها در جدول cymbal_inventory:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_inventory from stdin csv header"

خروجی موردانتظار:

student@cloudshell:~$ gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_inventory from stdin csv header"
Password for user postgres: 
COPY 263861
student@cloudshell:~$ 

در اینجا نمونه‌ای از چند ردیف از جدول cymbal_inventory آورده شده است.

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

خروجی:

student@cloudshell:~$ psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT * FROM cymbal_inventory LIMIT 3"
Password for user postgres: 
 store_id |             uniq_id              | inventory 
----------+----------------------------------+-----------
     1583 | adc4964a6138d1148b1d98c557546695 |         5
     1490 | adc4964a6138d1148b1d98c557546695 |         4
     1492 | adc4964a6138d1148b1d98c557546695 |         3
(3 rows)
student@cloudshell:~$ 

بار کردن داده‌ها در جدول cymbal_stores:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_stores from stdin csv header"

برونداد کنسول موردانتظار:

student@cloudshell:~$ gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\copy cymbal_stores from stdin csv header"
Password for user postgres: 
COPY 4654
student@cloudshell:~$

در اینجا نمونه‌ای از چند ردیف از جدول cymbal_stores آورده شده است.

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

خروجی:

student@cloudshell:~$ psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT store_id, name, zip_code FROM cymbal_stores limit 3"
Password for user postgres: 
 store_id |       name        | zip_code 
----------+-------------------+----------
     1990 | Mayaguez Store    |      680
     2267 | Ware Supercenter  |     1082
     4359 | Ponce Supercenter |      780
(3 rows)
student@cloudshell:~$ 

ساختن جاسازی‌ها

بااستفاده از psql به پایگاه داده نمایشی متصل شوید و براساس شرح محصولات، برای محصولات شرح‌داده‌شده در جدول cymbal_products جاسازی بسازید.

به پایگاه داده نمایشی متصل شوید:

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

از ستون embedding از نوع vector برای ذخیره کردن جاسازی‌های نوشتار تولیدشده برای شرح محصولات استفاده کنید.

فعال کردن زمان‌بندی پرسمان:

\timing

جاسازی‌ها را برای هر شرح محصول تولید کنید و آن‌ها را در جدول cymbal_embedding ذخیره کنید:

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

خروجی موردانتظار:

demo=# INSERT INTO cymbal_embedding(uniq_id,embedding)  SELECT uniq_id, google_ml.embedding('embeddinggemma',product_description)::vector FROM cymbal_products;
INSERT 0 941
Time: 497878.136 ms (08:17.878)
demo=#

اجرای پرسمان‌های جستجوی معنایی

در جلسه psql، پنج محصول برتر مطابق با سؤال "What kind of fruit trees grow well here?" را بااستفاده از فاصله کسینوسی (<=>) پیدا کنید:

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;

خروجی موردانتظار:

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

پُرسمان ۸۳ میلی‌ثانیه اجرا شد و فهرستی از درختان را از جدول cymbal_products برگرداند که با درخواست مطابقت داشتند و در فروشگاه شماره ۱۵۸۳ موجود بودند.

ساختن نمایه ANN

با مجموعه داده‌های کوچک، استفاده از جستجوی دقیق برای اسکن کردن همه جاسازی‌ها آسان است، اما وقتی داده‌ها افزایش می‌یابد، زمان بارگیری و پاسخ نیز افزایش می‌یابد. برای بهبود عملکرد می‌توانید نمایه‌هایی روی داده‌های جاسازی‌شده‌تان بسازید. در اینجا نمونه‌ای از نحوه انجام این کار بااستفاده از نمایه Google ScaNN برای داده‌های برداری آورده شده است.

اگر اتصال قطع شده است، دوباره به پایگاه داده نمایشی متصل شوید:

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

فعال کردن افزونه alloydb_scann:

CREATE EXTENSION IF NOT EXISTS alloydb_scann;

نمایه ScaNN را در ستون embedding ایجاد کنید:

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

پرسمان جستجوی معنایی را دوباره اجرا کنید تا عملکرد اجرا را مقایسه کنید:

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;

خروجی موردانتظار:

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

زمان اجرای پُرسمان کمی کاهش یافته است و این بهبود در مجموعه‌داده‌های بزرگ‌تر بیشتر قابل‌توجه خواهد بود. داده‌های برگردانده‌شده باید همان یا بسیار شبیه به چیزی باشد که بدون نمایه دریافت کردیم.

پرسمان‌های دیگر را امتحان کنید و در اسناد درباره بهینه‌سازی نمایه برداری بیشتر بخوانید.

خروج از جلسه psql:

\q

با قطع اتصال از جلسه instance-1 ssh با فشار دادن CTRL+D یا تایپ کردن exit، به Google Cloud Shell برگردید.

‫۸. پیاده‌سازی Gemma با vLLM

افزودن استخر گره برای Gemma

ابتدا بررسی کنید چه نوع گره‌هایی در منطقه شما دردسترس است:

gcloud compute accelerator-types list --filter="zone:${LOCATION}"

باید فهرستی از انواع شتاب‌دهنده‌های دردسترس، ازجمله شتاب‌دهنده nvidia-l4، را ببینید.

بااستفاده از vLLM، مانیفست استقرار برای مدل Google Gemini 4 12B ایجاد کنید:

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

اعمال کردن استقرار gemma-12b-gpu-vllm-deployment.yaml ذخیره‌شده:

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

خروجی موردانتظار:

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

منتظر بمانید تا استقرار تکمیل شود و مدل بار شود. ممکن است چند دقیقه طول بکشد.

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'

خروجی موردانتظار:

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

مدل را آزمایش کنید. برای دسترسی به مدل، بازارسال درگاه را فعال کنید:

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

در پنجره ترمینال دیگری، از curl برای ارسال پیام‌واره به مدل استفاده کنید:

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'

خروجی موردانتظار:

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

با فشار دادن Ctrl+C، بازارسال درگاه را در پایانه اول متوقف کنید (اگر هنوز درحال اجرا است).

‫۹. ثبت کردن مدل Gemma 4 در AlloyDB Omni

مدل Gemma 12B را بااستفاده از رویه google_ml.create_model در AlloyDB Omni ثبت کنید. http://gemma-12b-gpu-vllm-service:8000/v1/chat/completions را به‌عنوان model_request_url برای مسیریابی درخواست‌ها به سرویس خوشه Kubernetes مشخص کنید:

بازیابی IP نقطه پایانی AlloyDB Omni:

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

بااستفاده از SSH به نمونه VM متصل شوید:

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

پس‌از اتصال به VM، متغیر INSTANCE_IP را از مرحله قبلی صادر کنید (مقدار 10.128.0.33 به‌عنوان نمونه ارائه شده است - آن را با IP خودتان جایگزین کنید):

export INSTANCE_IP=10.128.0.33

صادر کردن گذرواژه AlloyDB:

export PGPASSWORD=VeryStrongPassword

به پایگاه داده demo متصل شوید:

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

در جلسه psql، مدل را ثبت کنید:

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

مدل را با پُرسمان SQL نمونه آزمایش کنید:

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

برای خروج از پنجره نتیجه و برگشتن به پیام‌واره psql، کلید q را فشار دهید

ترکیب کردن جستجوی برداری با LLM RAG در AlloyDB Omni

از جستجوی برداری با درخواست LLM برای نمایش RAG (تولید با کمک بازیابی) با LLM استفاده کنید.

پُرسمان SQL را در plsql اجرا کنید:

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;

خروجی موردانتظار:

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

پُرسمان پیام‌واره را با نتایج جستجوی برداری به «مدل زبانی بزرگ» اضافه می‌کند.

پرسمان‌های دیگر را امتحان کنید و با الگوهای RAG آزمایش کنید. مزیت معماری ارائه‌شده خودکفایی کامل آن است. داده‌ها به خارج از خوشه شما ارسال نمی‌شود و می‌تواند در محیط‌های کاملاً مجزا اجرا شود.

خروج از جلسه psql:

\q

اتصال از جلسه SSH به ماشین مجازی را قطع کنید:

exit

فراموش نکنید که AlloyDB Omni ویژگی‌ها و آزمایشگاه‌های بیشتری دارد.

‫۱۰. پاک‌سازی محیط

برای جلوگیری از کسر هزینه‌های جاری از حساب Google Cloud خود، منابع ایجادشده در این codelab را حذف کنید.

حذف خوشه GKE

در Cloud Shell، خوشه GKE را حذف کنید:

export PROJECT_ID=$(gcloud config get-value project)
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-east4]

Do you want to continue (Y/n)?  Y

Deleting cluster alloydb-ai-gke...done.
Deleted

حذف ماشین مجازی کارخواه

در Cloud Shell، نمونه Compute Engine را حذف کنید:

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

خروجی موردانتظار:

student@cloudshell:~$ export PROJECT_ID=$(gcloud config get project)
export ZONE=us-east4-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-east4-a]

Do you want to continue (Y/n)?  Y

Deleted

اگر پروژه جدیدی برای این codelab ایجاد کرده‌اید، می‌توانید کل پروژه را در مدیر منبع Google Cloud حذف کنید.

‫۱۱. تبریک می‌گوییم

بابت تکمیل codelab به شما تبریک می‌گوییم!

آنچه پوشش دادید

  • نحوه مستقر کردن AlloyDB Omni در خوشه GKE
  • نحوه متصل شدن به AlloyDB Omni
  • نحوه بار کردن داده‌ها در AlloyDB Omni
  • نحوه مستقر کردن مدل‌های هوش مصنوعی (جاسازی و مدل زبانی بزرگ) در GKE
  • نحوه ثبت کردن مدل‌های هوش مصنوعی در AlloyDB Omni
  • نحوه تولید جاسازی برای جستجوی معنایی
  • نحوه اجرای پُرسمان‌های جستجوی معنایی در AlloyDB Omni
  • نحوه ایجاد کردن و استفاده کردن از نمایه‌های برداری در AlloyDB Omni

در اسناد می‌توانید درباره کار با هوش مصنوعی در AlloyDB Omni بیشتر بخوانید.

نظرسنجی

خروجی:

چگونه از این آموزش استفاده خواهید کرد؟

فقط آن را خوانده‌اید آن را خوانده‌اید و تمرین‌ها را تکمیل کرده‌اید