1. Введение
В этом практическом занятии вы узнаете, как развернуть AlloyDB Omni на Google Kubernetes Engine (GKE) и использовать его с открытыми моделями, такими как EmbeddingGemma и Gemma 4, для эмбеддингов и прогнозирования. Запуск базы данных и моделей в одном кластере снижает задержку в сети и позволяет избежать зависимости от сторонних сервисов. Это также помогает соблюдать требования соответствия нормативным требованиям и правила размещения данных, поскольку ваши данные никогда не покидают вашу среду.

Предварительные требования
- Базовое понимание Google Cloud и консоли Google Cloud.
- Базовые знания Kubernetes и GKE.
- Знание интерфейса командной строки и Google Cloud Shell.
Что вы узнаете
- Как развернуть AlloyDB Omni в кластере GKE
- Как подключиться к AlloyDB Omni
- Как загрузить данные в AlloyDB Omni
- Как развернуть модели ИИ (встраивание и LLM) в GKE
- Как зарегистрировать модели ИИ в AlloyDB Omni
- Как сгенерировать векторные представления для семантического поиска
- Как выполнять семантические поисковые запросы в AlloyDB Omni
- Как создавать и использовать векторные индексы в AlloyDB Omni
Что вам понадобится
- Аккаунт Google Cloud и проект Google Cloud
- Веб-браузер, например Chrome.
2. Настройка и требования
Настройка проекта
- Войдите в консоль Google Cloud . Если у вас еще нет учетной записи Gmail или Google Workspace, создайте ее . Используйте личную учетную запись вместо рабочей или учебной.
- Создайте новый проект или выберите существующий. В заголовке консоли Google Cloud нажмите « Выбрать проект» , а затем нажмите «Новый проект» .

В окне «Выберите проект» нажмите кнопку «Новый проект» , чтобы открыть диалоговое окно создания проекта.

В диалоговом окне введите название проекта и выберите свою организацию или местоположение.

- Название проекта — это отображаемое имя участников данного проекта. Название проекта не используется API Google, и вы можете изменить его в любое время.
- Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Google Cloud автоматически генерирует уникальный идентификатор, или вы можете указать свой собственный. В этом практическом задании вы будете ссылаться на свой идентификатор проекта с помощью...
Заполнитель. - Номер проекта — это третий идентификатор, используемый некоторыми API. Для получения дополнительной информации см. документацию по Resource Manager .
Включить выставление счетов
Если вы настроили оплату с использованием кредитов Google Cloud, этот шаг можно пропустить.
Чтобы настроить личный платежный аккаунт, включите выставление счетов в консоли Google Cloud .
- Выполнение этой лабораторной работы обойдется менее чем в 5 долларов США в виде ресурсов Google Cloud.
- Выполните действия по очистке в конце этой лабораторной работы, чтобы удалить ресурсы и избежать дальнейших списаний средств.
- Новые пользователи могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .
Запустить Cloud Shell
В этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.
В консоли Google Cloud нажмите значок «Активировать Cloud Shell» на панели инструментов в правом верхнем углу:

В качестве альтернативы нажмите G, а затем S, или откройте Google Cloud Shell напрямую .
После подключения Cloud Shell отображает приглашение командной строки терминала:

Cloud Shell включает в себя инструменты для постоянного хранения данных и разработки. Вы можете выполнить все шаги этого практического занятия прямо из своего браузера.
3. Включите API.
Для использования Google Kubernetes Engine (GKE) для развертывания AlloyDB Omni и моделей, включите API Compute Engine и GKE в своем проекте 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
Включите необходимые API:
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 можно прочитать в документации .
4. Разверните AlloyDB Omni в GKE.
Для развертывания AlloyDB Omni в GKE подготовьте кластер Kubernetes в соответствии с требованиями оператора AlloyDB Omni .
Создайте кластер GKE.
Разверните стандартный кластер GKE, способный запускать AlloyDB Omni, оператор и контейнеры мониторинга. Для работы AlloyDB Omni требуется как минимум два процессора и 8 ГБ оперативной памяти. В этом руководстве используется машинный тип n2-standard-4 .
Настройте переменные среды для развертывания:
export PROJECT_ID=$(gcloud config get-value project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
export MACHINE_TYPE=n2-standard-4
Создайте стандартный кластер GKE:
gcloud container clusters create ${CLUSTER_NAME} \
--project=${PROJECT_ID} \
--region=${LOCATION} \
--workload-pool=${PROJECT_ID}.svc.id.goog \
--release-channel=rapid \
--machine-type=${MACHINE_TYPE} \
--num-nodes=1
Ожидаемый вывод в консоль:
student@cloudshell:~ (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
Подготовьте кластер
Установите необходимые компоненты, такие как cert-manager , встроенный контроллер сертификатов для Kubernetes. Подробности см. в документации по установке cert-manager .
Cloud Shell включает в себя инструмент командной строки Kubernetes kubectl . Получите учетные данные кластера с помощью gcloud :
gcloud container clusters get-credentials ${CLUSTER_NAME} --region=${LOCATION}
Установите cert-manager с помощью kubectl :
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.21.1/cert-manager.yaml
Ожидаемый вывод в консоль (засекречено):
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
Установите оператор AlloyDB Omni.
Установите оператор AlloyDB Omni с помощью Helm.
Загрузите и установите диаграмму операторов 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
Ожидаемый вывод в консоль (засекречено):
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
Разверните кластер баз данных.
Приведенный ниже манифест настраивает кластер баз данных с включенным расширением 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.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
Секретное значение пароля представляет собой представление VeryStrongPassword в формате Base64. В производственных средах для управления паролями используйте Google Secret Manager. Подробности см. в документации Secret Manager .
Манифест сохраняется как my-omni.yaml . В Cloud Shell нажмите «Открыть редактор» в правом верхнем углу окна терминала и прочитайте файл.

После ознакомления с манифестом my-omni.yaml нажмите «Открыть терминал» , чтобы вернуться к командной строке.

Примените манифест 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.3)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off, ALPN: postgresql)
Type "help" for help.
postgres=#
Для выхода из сессии psql введите \q и нажмите Enter:
postgres=# \q
5. Разверните модель EmbeddingGemma в GKE.
Для тестирования интеграции AlloyDB Omni AI с локальными моделями разверните модель встраивания в кластере GKE. В этом руководстве используется модель EmbeddingGemma от Google.
Создайте пул узлов для модели.
Для выполнения вывода модели подготовьте выделенный пул узлов. Вы можете использовать пул узлов только с процессором или пул узлов с ускорением на графическом процессоре (например, g2-standard-8 с графическим процессором NVIDIA L4). В этом руководстве используется пул узлов на базе процессора с типами машин c3-standard-8 .
Создайте пул одноузловых ЦП-узлов:
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
Ожидаемый результат:
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
Получите жетон "Обнимающее лицо"
В этом руководстве показана реализация модели EmbeddingGemma из Hugging Face . Для доступа к весам модели необходимо сгенерировать токен доступа Hugging Face:
- Войдите в систему или создайте учетную запись на Hugging Face .
- Перейдите в раздел «Ваш профиль» > «Токены доступа» .
- Нажмите «Создать новый токен» .
- Введите имя для токена и выберите роль «Чтение» .
- Нажмите «Создать токен» и скопируйте сгенерированное значение токена.
- Если вы еще этого не сделали, примите условия использования модели на странице модели EmbeddingGemma .
Создайте в Cloud Shell секрет Kubernetes, содержащий ваш токен Hugging Face (замените заполнитель token на свой токен):
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 -
Подготовьте манифест развертывания.
Для развертывания модели используйте контейнерный пакет Hugging Face Text Embeddings Inference (TEI). Дополнительную информацию см. в документации Hugging Face GKE TEI .
Клонируйте репозиторий развертывания из GitHub:
git clone https://github.com/huggingface/Google-Cloud-Containers
Проверьте и измените манифест конфигурации ЦП:
edit Google-Cloud-Containers/examples/gke/tei-deployment/cpu-config/deployment.yaml
Обновленный манифест для развертывания на ЦП:
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, нажав кнопку «+» в верхней части терминала:

В новой вкладке протестируйте генерацию встраивания с помощью 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 .
6. Зарегистрируйте модель встраивания в AlloyDB Omni.
Для использования развернутой модели из AlloyDB Omni необходимо создать базу данных, определить функции преобразования и зарегистрировать конечную точку модели.
Создайте клиентскую виртуальную машину и базу данных.
Создайте экземпляр виртуальной машины Compute Engine в той же VPC, который будет выступать в качестве промежуточного хоста для клиентов:

В Cloud Shell создайте клиентскую виртуальную машину:
export ZONE=us-central1-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:
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
Подключитесь к AlloyDB Omni с помощью psql (пароль: VeryStrongPassword ):
psql "host=$INSTANCE_IP user=postgres sslmode=require"
В сессии psql создайте demo базу данных:
CREATE DATABASE demo;
Переключиться на demo базу данных:
\c demo
Создайте функции преобразования
Для пользовательских конечных точек встраивания требуются функции преобразования входных и выходных данных для адаптации форматов данных между AlloyDB Omni и API модели.
Создайте функцию преобразования входных данных:
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=#
Зарегистрируйте модель
Зарегистрируйте модель в AlloyDB Omni, используя процедуру google_ml.create_model . Укажите 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.
Нажмите q , чтобы вернуться к командной строке psql .
Выход из сессии psql:
\q
7. Проверьте модель на примерах данных.
Загрузите пример данных
В этом руководстве для демонстрации поиска векторного сходства используется набор данных о розничной продаже продукции Cymbal. Для импорта данных в AlloyDB Omni вы будете использовать Google Cloud SDK и клиент PostgreSQL.
В сеансе SSH на 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=#
Запрос выполнился за 83 мс и вернул список деревьев из таблицы cymbal_products, соответствующих запросу и имеющих в наличии в магазине номер 1583.
Построить индекс ИНС
При работе с небольшим набором данных легко использовать точный поиск, сканируя все эмбеддинги, но по мере роста объема данных увеличиваются и время загрузки, и время отклика. Для повышения производительности можно создавать индексы на основе данных эмбеддингов. Вот пример того, как это сделать, используя индекс 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
Чтобы вернуться в Google Cloud Shell, отключитесь от SSH-сессии экземпляра instance-1 нажав CTRL+D или введя команду exit .
8. Разверните Gemma с помощью vLLM
Добавить пул узлов для Джеммы
Для начала проверьте, какие типы узлов доступны в вашем регионе:
export LOCATION=us-central1-a
gcloud compute accelerator-types list --filter="zone:${LOCATION}"
Вы должны увидеть список доступных типов ускорителей, включая ускоритель nvidia-l4. Теперь создайте пул узлов с типом ускорителя nvidia-l4:
export PROJECT_ID=$(gcloud config get project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
gcloud container node-pools create gpupool \
--accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \
--project=${PROJECT_ID} \
--location=${LOCATION} \
--node-locations=${LOCATION}-a \
--cluster=${CLUSTER_NAME} \
--machine-type=g2-standard-8 \
--num-nodes=1
Создайте манифест развертывания для модели Google Gemini 4 12B с помощью 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
Примените сохраненный файл развертывания 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 .
9. Зарегистрируйте модель Gemma 4 в AlloyDB Omni.
Зарегистрируйте модель Gemma 12B в AlloyDB Omni, используя процедуру google_ml.create_model . Укажите 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:
export ZONE=us-central1-a
gcloud compute ssh instance-1 --zone=$ZONE
После подключения к виртуальной машине экспортируйте переменную 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';
Нажмите q , чтобы выйти из окна результатов и вернуться в командную строку psql
Объедините векторный поиск с LLM RAG в AlloyDB Omni.
Используйте векторный поиск с запросом LLM для демонстрации RAG (генерация с расширенными возможностями поиска) с использованием LLM.
Выполните SQL-запрос в 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;
Ожидаемый результат:
----------------------------------------------------------------------------------------------------------------------------------------------
"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)
Данный запрос дополняет подсказку для LLM результатами векторного поиска.
Попробуйте другие запросы и поэкспериментируйте с шаблонами RAG. Преимущество представленной архитектуры заключается в ее полной самодостаточности. Данные не передаются за пределы вашего кластера, и она может работать в полностью изолированных средах.
Выход из сессии psql :
\q
Отключитесь от SSH-сессии, подключенной к виртуальной машине:
exit
Не забывайте, что AlloyDB Omni обладает большим количеством функций и тестовых примеров.
10. Очистка окружающей среды
Чтобы избежать постоянных расходов на ваш аккаунт Google Cloud, удалите ресурсы, созданные в этом практическом задании.
Удалите кластер GKE.
В Cloud Shell удалите кластер 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}
Ожидаемый результат:
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
Удалите клиентскую виртуальную машину
В Cloud Shell удалите экземпляр 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}
Ожидаемый результат:
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
Если вы создали новый проект для этого практического занятия, вы можете при желании удалить весь проект в Google Cloud Resource Manager .
11. Поздравляем!
Поздравляем с завершением практического занятия!
Что вы осветили
- Как развернуть AlloyDB Omni в кластере GKE
- Как подключиться к AlloyDB Omni
- Как загрузить данные в AlloyDB Omni
- Как развернуть модели ИИ (встраивание и LLM) в GKE
- Как зарегистрировать модели ИИ в AlloyDB Omni
- Как сгенерировать векторные представления для семантического поиска
- Как выполнять семантические поисковые запросы в AlloyDB Omni
- Как создавать и использовать векторные индексы в AlloyDB Omni
Более подробную информацию о работе с ИИ в AlloyDB Omni можно найти в документации .
Опрос
Выход: