Bu codelab hakkında
1. Giriş
Bu codelab'de, AlloyDB Omni'yi GKE'de nasıl dağıtacağınızı ve aynı Kubernetes kümesinde dağıtılan açık bir yerleşik modelle nasıl kullanacağınızı öğreneceksiniz. Bir modelin aynı GKE kümesinde veritabanı örneğinin yanına dağıtılması, gecikmeyi ve üçüncü taraf hizmetlerine olan bağımlılıkları azaltır. Ayrıca, verilerin kuruluştan çıkmaması ve üçüncü taraf hizmetlerinin kullanımına izin verilmemesi gerektiğinde güvenlik şartları tarafından talep edilebilir.
Ön koşullar
- Google Cloud ve Console hakkında temel düzeyde bilgi
- Komut satırı arayüzü ve Cloud Shell'de temel beceriler
Neler öğreneceksiniz?
- AlloyDB Omni'yi Google Kubernetes kümesine dağıtma
- AlloyDB Omni'ye bağlanma
- AlloyDB Omni'ye veri yükleme
- Açık yerleşik modelleri GKE'ye dağıtma
- AlloyDB Omni'ye yerleştirme modelini kaydetme
- Semantik arama için yerleştirilmiş öğeler oluşturma
- AlloyDB Omni'de semantik arama için oluşturulan yerleştirilmiş öğeleri kullanma
- AlloyDB'de vektör dizini oluşturma ve kullanma
Gerekenler
- Google Cloud hesabı ve Google Cloud projesi
- Google Cloud Console ve Cloud Shell'ı destekleyen Chrome gibi bir web tarayıcısı
2. Kurulum ve Gereksinimler
Kendine ait tempoda ortam oluşturma
- Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.
- Proje adı, bu projenin katılımcılarının görünen adıdır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman güncelleyebilirsiniz.
- Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dize otomatik olarak oluşturur. Bu dizenin ne olduğu genellikle önemli değildir. Çoğu kod laboratuvarında proje kimliğinize (genellikle
PROJECT_ID
olarak tanımlanır) referans vermeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele başka bir kimlik oluşturabilirsiniz. Alternatif olarak, kendi anahtarınızı deneyerek kullanılabilir olup olmadığını görebilirsiniz. Bu adımdan sonra değiştirilemez ve proje boyunca geçerli kalır. - Bazı API'lerin kullandığı üçüncü bir değer (Proje Numarası) olduğunu belirtmek isteriz. Bu üç değer hakkında daha fazla bilgiyi dokümanlar bölümünde bulabilirsiniz.
- Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmak çok pahalı değildir. Bu eğitimden sonra faturalandırılmamak için kaynakları kapatmak istiyorsanız oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programına uygundur.
Cloud Shell'i başlatma
Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir olsa da bu kod laboratuvarında bulutta çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.
Google Cloud Console'da, sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:
Ortam sağlanıp bağlantı kurulabilmesi için birkaç saniye beklemeniz gerekir. İşlem tamamlandığında aşağıdakine benzer bir ekran görürsünüz:
Bu sanal makinede ihtiyaç duyacağınız tüm geliştirme araçları yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu codelab'deki tüm çalışmalarınızı tarayıcıda yapabilirsiniz. Hiçbir şey yüklemeniz gerekmez.
3. Başlamadan önce
API'yi etkinleştirme
Çıkış:
Cloud Shell'de proje kimliğinizin ayarlandığından emin olun:
PROJECT_ID=$(gcloud config get-value project)
echo $PROJECT_ID
Cloud Shell yapılandırmasında tanımlanmadıysa aşağıdaki komutları kullanarak ayarlayın
export PROJECT_ID=<your project>
gcloud config set project $PROJECT_ID
Gerekli tüm hizmetleri etkinleştirin:
gcloud services enable compute.googleapis.com
gcloud services enable container.googleapis.com
Beklenen çıkış
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=test-project-001-402417 student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417 Updated property [core/project]. student@cloudshell:~ (test-project-001-402417)$ gcloud services enable compute.googleapis.com gcloud services enable container.googleapis.com Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.
4. AlloyDB Omni'yi GKE'ye dağıtma
AlloyDB Omni'yi GKE'de dağıtmak için AlloyDB Omni operatör koşullarında listelenen koşulları karşılayan bir Kubernetes kümesi hazırlamamız gerekir.
GKE kümesi oluşturma
AlloyDB Omni örneğiyle bir kapsül dağıtmak için yeterli havuz yapılandırmasına sahip standart bir GKE kümesi dağıtmamız gerekiyor. Omni için en az 2 CPU ve 8 GB RAM'e, ayrıca operatör ve izleme hizmetleri için biraz alana ihtiyacımız var.
Dağıtımınız için ortam değişkenlerini ayarlayın.
export PROJECT_ID=$(gcloud config get project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
export MACHINE_TYPE=e2-standard-4
Ardından, GKE standart kümesini oluşturmak için gcloud'u kullanırız.
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
Beklenen konsol çıkışı:
student@cloudshell:~ (gleb-test-short-001-415614)$ export PROJECT_ID=$(gcloud config get project) export LOCATION=us-central1 export CLUSTER_NAME=alloydb-ai-gke export MACHINE_TYPE=n2-highmem-2 Your active configuration is: [gleb-test-short-001-415614] student@cloudshell:~ (gleb-test-short-001-415614)$ gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --region=${LOCATION} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --release-channel=rapid \ --machine-type=${MACHINE_TYPE} \ --num-nodes=1 Note: The Kubelet readonly port (10255) is now deprecated. Please update your workloads to use the recommended alternatives. See https://cloud.google.com/kubernetes-engine/docs/how-to/disable-kubelet-readonly-port for ways to check usage and for migration instructions. Note: Your Pod address range (`--cluster-ipv4-cidr`) can accommodate at most 1008 node(s). Creating cluster alloydb-ai-gke in us-central1.. NAME: omni01 ZONE: us-central1-a MACHINE_TYPE: e2-standard-4 PREEMPTIBLE: INTERNAL_IP: 10.128.0.3 EXTERNAL_IP: 35.232.157.123 STATUS: RUNNING student@cloudshell:~ (gleb-test-short-001-415614)$
Kümeyi hazırlama
cert-manager hizmeti gibi gerekli bileşenleri yüklememiz gerekiyor. cert-manager kurulumu dokümanlarında yer alan adımları uygulayabiliriz.
Cloud Shell'de zaten yüklü olan kubectl adlı Kubernetes komut satırı aracını kullanırız. Yardımcı programı kullanmadan önce kümemizin kimlik bilgilerini almamız gerekir.
gcloud container clusters get-credentials ${CLUSTER_NAME} --region=${LOCATION}
Artık kubectl'i kullanarak cert-manager'ı yükleyebiliriz:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.2/cert-manager.yaml
Beklenen konsol çıkışı(düzenlendi):
student@cloudshell:~$ kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.2/cert-manager.yaml namespace/cert-manager created customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created ... validatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
AlloyDB Omni'yi yükleme
AlloyDB Omni operatörü, helm yardımcı programı kullanılarak yüklenebilir.
AlloyDB Omni operatörünü yüklemek için aşağıdaki komutu çalıştırın:
export GCS_BUCKET=alloydb-omni-operator
export HELM_PATH=$(gcloud storage cat gs://$GCS_BUCKET/latest)
export OPERATOR_VERSION="${HELM_PATH%%/*}"
gcloud storage cp gs://$GCS_BUCKET/$HELM_PATH ./ --recursive
helm install alloydbomni-operator alloydbomni-operator-${OPERATOR_VERSION}.tgz \
--create-namespace \
--namespace alloydb-omni-system \
--atomic \
--timeout 5m
Beklenen konsol çıkışı(düzenlendi):
student@cloudshell:~$ gcloud storage cp gs://$GCS_BUCKET/$HELM_PATH ./ --recursive Copying gs://alloydb-omni-operator/1.2.0/alloydbomni-operator-1.2.0.tgz to file://./alloydbomni-operator-1.2.0.tgz Completed files 1/1 | 126.5kiB/126.5kiB student@cloudshell:~$ helm install alloydbomni-operator alloydbomni-operator-${OPERATOR_VERSION}.tgz \ > --create-namespace \ > --namespace alloydb-omni-system \ > --atomic \ > --timeout 5m NAME: alloydbomni-operator LAST DEPLOYED: Mon Jan 20 13:13:20 2025 NAMESPACE: alloydb-omni-system STATUS: deployed REVISION: 1 TEST SUITE: None student@cloudshell:~$
AlloyDB Omni operatörü yüklendiğinde veritabanı kümemizin dağıtımını takip edebiliriz.
Aşağıda, etkinleştirilmiş googleMLExtension parametresi ve dahili (özel) yük dengeleyici içeren dağıtım manifesti örneği verilmiştir:
apiVersion: v1
kind: Secret
metadata:
name: db-pw-my-omni
type: Opaque
data:
my-omni: "VmVyeVN0cm9uZ1Bhc3N3b3Jk"
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
name: my-omni
spec:
databaseVersion: "15.7.0"
primarySpec:
adminUser:
passwordRef:
name: db-pw-my-omni
features:
googleMLExtension:
enabled: true
resources:
cpu: 1
memory: 8Gi
disks:
- name: DataDisk
size: 20Gi
storageClass: standard
dbLoadBalancerOptions:
annotations:
networking.gke.io/load-balancer-type: "internal"
allowExternalIncomingTraffic: true
Şifrenin gizli değeri, "ÇokGüçlüŞifre" şifre kelimesinin Base64 gösterimidir. Daha güvenilir bir yöntem, şifre değerini depolamak için Google Secret Manager'ı kullanmaktır. Bu konu hakkında daha fazla bilgiyi dokümanlarda bulabilirsiniz.
Manifesti, sonraki adımda uygulanacak şekilde my-omni.yaml olarak kaydedin. Cloud Shell'deyseniz terminalin sağ üst kısmındaki "Düzenleyiciyi Aç" düğmesine basarak düzenleyiciyi kullanarak bunu yapabilirsiniz.
Dosyayı my-omni.yaml olarak kaydettikten sonra "Terminali Aç" düğmesine basarak terminale geri dönün.
kubectl yardımcı programını kullanarak my-omni.yaml manifestini kümeye uygulayın:
kubectl apply -f my-omni.yaml
Beklenen konsol çıkışı:
secret/db-pw-my-omni created dbcluster.alloydbomni.dbadmin.goog/my-omni created
kubectl yardımcı programını kullanarak my-omni kümenizin durumunu kontrol edin:
kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default
Dağıtım sırasında küme farklı aşamalardan geçer ve sonunda DBClusterReady durumunda sona erer.
Beklenen konsol çıkışı:
$ kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default NAME PRIMARYENDPOINT PRIMARYPHASE DBCLUSTERPHASE HAREADYSTATUS HAREADYREASON my-omni 10.131.0.33 Ready DBClusterReady
AlloyDB Omni'ye bağlanma
Kubernetes Kapsülü Kullanarak Bağlanma
Küme hazır olduğunda AlloyDB Omni örnek kapsülündeki PostgreSQL istemci ikililerini kullanabiliriz. Pod kimliğini bulup kubectl'i kullanarak doğrudan pod'a bağlanır ve istemci yazılımını çalıştırırız. Şifre, my-omni.yaml dosyasında karma oluşturma işlemiyle ayarlandığı üzere ÇokGüçlüŞifre'dir:
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
Örnek konsol çıkışı:
DB_CLUSTER_NAME=my-omni DB_CLUSTER_NAMESPACE=default DBPOD=`kubectl get pod --selector=alloydbomni.internal.dbadmin.goog/dbcluster=$DB_CLUSTER_NAME,alloydbomni.internal.dbadmin.goog/task-type=database -n $DB_CLUSTER_NAMESPACE -o jsonpath='{.items[0].metadata.name}'` kubectl exec -ti $DBPOD -n $DB_CLUSTER_NAMESPACE -c database -- psql -h localhost -U postgres Password for user postgres: psql (15.7) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off) Type "help" for help. postgres=#
5. GKE'de yapay zeka modelini dağıtma
AlloyDB Omni AI entegrasyonunu yerel modellerle test etmek için kümeye bir model dağıtmamız gerekir.
Model için düğüm havuzu oluşturma
Modeli çalıştırmak için çıkarım çalıştıracak bir düğüm havuzu hazırlamamız gerekir. Performans açısından en iyi yaklaşım, L4 Nvidia hızlandırıcılı g2-standard-8 gibi bir düğüm yapılandırması kullanan grafik hızlandırıcılara sahip bir havuzdur.
L4 hızlandırıcıyla düğüm havuzu oluşturun:
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
Beklenen çıkış
student@cloudshell$ export PROJECT_ID=$(gcloud config get project) Your active configuration is: [pant] export LOCATION=us-central1 export CLUSTER_NAME=alloydb-ai-gke student@cloudshell$ gcloud container node-pools create gpupool \ > --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \ > --project=${PROJECT_ID} \ > --location=${LOCATION} \ > --node-locations=${LOCATION}-a \ > --cluster=${CLUSTER_NAME} \ > --machine-type=g2-standard-8 \ > --num-nodes=1 Note: Machines with GPUs have certain limitations which may affect your workflow. Learn more at https://cloud.google.com/kubernetes-engine/docs/how-to/gpus Note: Starting in GKE 1.30.1-gke.115600, if you don't specify a driver version, GKE installs the default GPU driver for your node's GKE version. Creating node pool gpupool...done. Created [https://container.googleapis.com/v1/projects/student-test-001/zones/us-central1/clusters/alloydb-ai-gke/nodePools/gpupool]. NAME MACHINE_TYPE DISK_SIZE_GB NODE_VERSION gpupool g2-standard-8 100 1.31.4-gke.1183000
Dağıtım manifestini hazırlama
Modeli dağıtmak için bir dağıtım manifesti hazırlamamız gerekir.
Hugging Face'ın BGE Base v1.5 yerleştirme modelini kullanıyoruz. Model kartını buradan okuyabilirsiniz. Modeli dağıtmak için Hugging Face'taki hazır talimatları ve GitHub'daki dağıtım paketini kullanabiliriz.
Paketi klonlama
git clone https://github.com/huggingface/Google-Cloud-Containers
cloud.google.com/gke-accelerator değerini nvidia-l4 ile değiştirip kaynaklara sınırlar ekleyerek manifest dosyasını düzenleyin.
vi Google-Cloud-Containers/examples/gke/tei-deployment/gpu-config/deployment.yaml
Düzeltilmiş manifesti aşağıda bulabilirsiniz.
apiVersion: apps/v1
kind: Deployment
metadata:
name: tei-deployment
spec:
replicas: 1
selector:
matchLabels:
app: tei-server
template:
metadata:
labels:
app: tei-server
hf.co/model: Snowflake--snowflake-arctic-embed-m
hf.co/task: text-embeddings
spec:
containers:
- name: tei-container
image: us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-embeddings-inference-cu122.1-4.ubuntu2204:latest
resources:
requests:
nvidia.com/gpu: 1
limits:
nvidia.com/gpu: 1
env:
- name: MODEL_ID
value: Snowflake/snowflake-arctic-embed-m
- name: NUM_SHARD
value: "1"
- name: PORT
value: "8080"
volumeMounts:
- mountPath: /dev/shm
name: dshm
- mountPath: /data
name: data
volumes:
- name: dshm
emptyDir:
medium: Memory
sizeLimit: 1Gi
- name: data
emptyDir: {}
nodeSelector:
cloud.google.com/gke-accelerator: nvidia-l4
Modeli dağıtma
Dağıtım için bir hizmet hesabı ve ad alanı hazırlamamız gerekiyor.
hf-gke-namespace adlı bir Kubernetes ad alanı oluşturun.
export NAMESPACE=hf-gke-namespace
kubectl create namespace $NAMESPACE
Kubernetes hizmet hesabı oluşturma
export SERVICE_ACCOUNT=hf-gke-service-account
kubectl create serviceaccount $SERVICE_ACCOUNT --namespace $NAMESPACE
Modeli dağıtma
kubectl apply -f Google-Cloud-Containers/examples/gke/tei-deployment/gpu-config
Dağıtımları doğrulama
kubectl get pods
Model hizmetini doğrulama
kubectl get service tei-service
Çalışan hizmet türünü (ClusterIP) göstermesi gerekir.
Örnek çıktı:
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
Uç nokta adresimiz olarak hizmetin CLUSTER-IP değerini kullanacağız. Model yerleştirme, http://34.118.233.48:8080/embed URI'sine göre yanıt verebilir. Bu ad, modeli AlloyDB Omni'ye kaydettiğinizde daha sonra kullanılır.
kubectl port-forward komutunu kullanarak bu hizmeti kullanıma sunarak test edebiliriz.
kubectl port-forward service/tei-service 8080:8080
Bağlantı noktası yönlendirme işlemi bir Cloud Shell oturumunda çalışacak ve bunu test etmek için başka bir oturuma ihtiyacımız var.
Üstteki "+" işaretini kullanarak başka bir Cloud Shell sekmesi açın.
Ardından yeni kabuk oturumunda bir curl komutu çalıştırın.
curl http://localhost:8080/embed \
-X POST \
-d '{"inputs":"Test"}' \
-H 'Content-Type: application/json'
Aşağıdaki örnek çıkışta (gizlenmiş) gösterildiği gibi bir vektör dizisi döndürür:
curl http://localhost:8080/embed \ > -X POST \ > -d '{"inputs":"Test"}' \ > -H 'Content-Type: application/json' [[-0.018975832,0.0071419072,0.06347208,0.022992613,0.014205903 ... -0.03677433,0.01636146,0.06731572]]
6. Modeli AlloyDB Omni'ye kaydetme
AlloyDB Omni'nin dağıtılan modelle nasıl çalıştığını test etmek için bir veritabanı oluşturmamız ve modeli kaydetmemiz gerekir.
Veritabanı Oluşturma
Atlama kutusu olarak bir GCE sanal makinesi oluşturun, istemci sanal makinenizden AlloyDB Omni'ye bağlanın ve bir veritabanı oluşturun.
Omni için GKE harici yük dengeleyicisi, özel IP adreslemeyi kullanarak VPC'den erişim sağlar ancak VPC dışından bağlanmanıza izin vermez. Bu nedenle, atlama kutusuna ihtiyacımız var. Genel olarak daha güvenlidir ve veritabanı örneğinizi internete maruz bırakmaz. Daha net bilgi için lütfen şemayı inceleyin.
Cloud Shell oturumunda sanal makine oluşturmak için şunları yürütün:
export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE
Cloud Shell'de kubectl kullanarak AlloyDB Omni uç noktası IP'sini bulun:
kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default
PRIMARYENDPOINT değerini not edin. Aşağıda bir örnek verilmiştir.
çıktı:
student@cloudshell:~$ kubectl get dbclusters.alloydbomni.dbadmin.goog my-omni -n default NAME PRIMARYENDPOINT PRIMARYPHASE DBCLUSTERPHASE HAREADYSTATUS HAREADYREASON my-omni 10.131.0.33 Ready DBClusterReady student@cloudshell:~$
10.131.0.33, AlloyDB Omni örneğine bağlanmak için örneklerimizde kullanacağımız IP adresidir.
gcloud kullanarak sanal makineye bağlanın:
gcloud compute ssh instance-1 --zone=$ZONE
SSH anahtarı oluşturma isteğinde bulunulursa talimatları uygulayın. SSH bağlantısı hakkında daha fazla bilgiyi dokümanlar bölümünde bulabilirsiniz.
Sanal makinenin SSH oturumunda PostgreSQL istemcisini yükleyin:
sudo apt-get update
sudo apt-get install --yes postgresql-client
AlloyDB Omni yük dengeleyici IP'sini aşağıdaki örnekte gösterildiği gibi dışa aktarın (IP'yi yük dengeleyici IP'nizle değiştirin):
export INSTANCE_IP=10.131.0.33
AlloyDB Omni'ye bağlanın. Şifre, my-omni.yaml dosyasında karma oluşturma işlemiyle ayarlandığı gibi ÇokGüçlüŞifre'dir:
psql "host=$INSTANCE_IP user=postgres sslmode=require"
Oluşturulan psql oturumunda şunları yürütün:
create database demo;
Oturumdan çıkın ve veritabanı demosuna bağlanın (veya aynı oturumda "\c demo" komutunu çalıştırabilirsiniz)
psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"
Dönüşüm işlevleri oluşturma
Üçüncü taraf yerleştirme modelleri için girişi ve çıkışı modelin ve dahili işlevlerimizin beklediği biçimde biçimlendiren dönüştürme işlevleri oluşturmamız gerekir.
Girişle ilgilenen dönüştürme işlevi aşağıda verilmiştir:
-- Input Transform Function corresponding to the custom model endpoint
CREATE OR REPLACE FUNCTION tei_text_input_transform(model_id VARCHAR(100), input_text TEXT)
RETURNS JSON
LANGUAGE plpgsql
AS $$
DECLARE
transformed_input JSON;
model_qualified_name TEXT;
BEGIN
SELECT json_build_object('inputs', input_text, 'truncate', true)::JSON INTO transformed_input;
RETURN transformed_input;
END;
$$;
Demo veritabanına bağlıyken örnek çıkışta gösterildiği gibi sağlanan kodu yürütün:
demo=# -- Input Transform Function corresponding to the custom model endpoint CREATE OR REPLACE FUNCTION tei_text_input_transform(model_id VARCHAR(100), input_text TEXT) RETURNS JSON LANGUAGE plpgsql AS $$ DECLARE transformed_input JSON; model_qualified_name TEXT; BEGIN SELECT json_build_object('inputs', input_text, 'truncate', true)::JSON INTO transformed_input; RETURN transformed_input; END; $$; CREATE FUNCTION demo=#
Modelden gelen yanıtı gerçek sayılar dizisine dönüştüren çıkış işlevi ise şu şekildedir:
-- Output Transform Function corresponding to the custom model endpoint
CREATE OR REPLACE FUNCTION tei_text_output_transform(model_id VARCHAR(100), response_json JSON)
RETURNS REAL[]
LANGUAGE plpgsql
AS $$
DECLARE
transformed_output REAL[];
BEGIN
SELECT ARRAY(SELECT json_array_elements_text(response_json->0)) INTO transformed_output;
RETURN transformed_output;
END;
$$;
Aynı oturumda çalıştırın:
demo=# -- Output Transform Function corresponding to the custom model endpoint CREATE OR REPLACE FUNCTION tei_text_output_transform(model_id VARCHAR(100), response_json JSON) RETURNS REAL[] LANGUAGE plpgsql AS $$ DECLARE transformed_output REAL[]; BEGIN SELECT ARRAY(SELECT json_array_elements_text(response_json->0)) INTO transformed_output; RETURN transformed_output; END; $$; CREATE FUNCTION demo=#
Modeli kaydetme
Artık modeli veritabanına kaydedebiliriz.
Modeli bge-base-1.5 adıyla kaydettirmek için aşağıdaki prosedür çağrısını kullanın. 34.118.233.48 IP adresini model hizmetinizin IP adresiyle (kubectl get service tei-service komutunun çıkışı) değiştirin:
CALL
google_ml.create_model(
model_id => 'bge-base-1.5',
model_request_url => 'http://34.118.233.48:8080/embed',
model_provider => 'custom',
model_type => 'text_embedding',
model_in_transform_fn => 'tei_text_input_transform',
model_out_transform_fn => 'tei_text_output_transform');
Demo veritabanına bağlıyken sağlanan kodu yürütün:
demo=# CALL google_ml.create_model( model_id => 'bge-base-1.5', model_request_url => 'http://34.118.233.48:8080/embed', model_provider => 'custom', model_type => 'text_embedding', model_in_transform_fn => 'tei_text_input_transform', model_out_transform_fn => 'tei_text_output_transform'); CALL demo=#
Gerçek sayı dizisi döndürmesi gereken aşağıdaki test sorgusunu kullanarak kayıt modelini test edebiliriz.
select google_ml.embedding('bge-base-1.5','What is AlloyDB Omni?');
7. Modeli AlloyDB Omni'de test etme
Veri Yükleme
AlloyDB Omni'nin dağıtılan modelle nasıl çalıştığını test etmek için bazı veriler yüklememiz gerekir. AlloyDB'de vektör arama için diğer kod laboratuvarlarından birinde kullanılan verileri kullandım.
Verileri yüklemenin bir yolu, Google Cloud SDK'sını ve PostgreSQL istemci yazılımını kullanmaktır. Demo veritabanını oluşturmak için kullanılan istemci sanal makinesini kullanabiliriz. Sanal makine resmi için varsayılan ayarları kullandıysanız Google Cloud SDK'sı zaten yüklenmiş olmalıdır. Ancak Google SDK'sı olmadan özel bir resim kullandıysanız dokümanları inceleyerek bu resmi ekleyebilirsiniz.
AlloyDB Omni yük dengeleyici IP'sini aşağıdaki örnekte gösterildiği gibi dışa aktarın (IP'yi yük dengeleyici IP'nizle değiştirin):
export INSTANCE_IP=10.131.0.33
Veritabanına bağlanın ve pgvector uzantısını etkinleştirin.
psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"
psql oturumunda:
CREATE EXTENSION IF NOT EXISTS vector;
psql oturumundan çıkın ve komut satırı oturumunda verileri demo veritabanına yüklemek için komutları yürütün.
Tabloları oluşturun:
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=demo"
Beklenen konsol çıkışı:
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:~$
Oluşturulan tabloların listesi aşağıda verilmiştir:
psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\dt+"
Çıkış:
student@cloudshell:~$ psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "\dt+" Password for user postgres: List of relations Schema | Name | Type | Owner | Persistence | Access method | Size | Description --------+------------------+-------+----------+-------------+---------------+------------+------------- public | cymbal_embedding | table | postgres | permanent | heap | 8192 bytes | public | cymbal_inventory | table | postgres | permanent | heap | 8192 bytes | public | cymbal_products | table | postgres | permanent | heap | 8192 bytes | public | cymbal_stores | table | postgres | permanent | heap | 8192 bytes | (4 rows) student@cloudshell:~$
cymbal_products tablosuna veri yükleyin:
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"
Beklenen konsol çıkışı:
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 tablosundaki birkaç satırın örneği aşağıda verilmiştir.
psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT uniq_id,left(product_name,30),left(product_description,50),sale_price FROM cymbal_products limit 3"
Çıkış:
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 tablosuna veri yükleyin:
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"
Beklenen konsol çıkışı:
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 tablosundaki birkaç satırın örneğini aşağıda bulabilirsiniz.
psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT * FROM cymbal_inventory LIMIT 3"
Çıkış:
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 tablosuna veri yükleyin:
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"
Beklenen konsol çıkışı:
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 tablosundaki birkaç satırın örneğini aşağıda bulabilirsiniz.
psql "host=$INSTANCE_IP user=postgres dbname=demo" -c "SELECT store_id, name, zip_code FROM cymbal_stores limit 3"
Çıkış:
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:~$
Yerleştirme oluşturma
psql kullanarak demo veritabanına bağlanın ve cymbal_products tablosunda açıklanan ürünler için ürün adlarına ve açıklamalarına göre yerleştirmeler oluşturun.
Demo veritabanına bağlanın:
psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"
Yerleşimlerimizi depolamak için sütun yerleştirme içeren bir cymbal_embedding tablosu kullanıyoruz ve işleve metin girişi olarak ürün açıklamasını kullanıyoruz.
Sorgularınızın daha sonra uzak modellerle karşılaştırılması için zamanlamayı etkinleştirin.:
\timing
Yerleşimleri oluşturmak için sorguyu çalıştırın:
INSERT INTO cymbal_embedding(uniq_id,embedding) SELECT uniq_id, google_ml.embedding('bge-base-1.5',product_description)::vector FROM cymbal_products;
Beklenen konsol çıkışı:
demo=# INSERT INTO cymbal_embedding(uniq_id,embedding) SELECT uniq_id, google_ml.embedding('bge-base-1.5',product_description)::vector FROM cymbal_products; INSERT 0 941 Time: 11069.762 ms (00:11.070) demo=#
Bu örnekte, 941 kayıt için yerleştirme oluşturma işlemi yaklaşık 11 saniye sürdü.
Test sorguları çalıştırma
psql kullanarak demo veritabanına bağlanın ve zamanlamayı etkinleştirerek sorgularımızın yürütme süresini ölçün. Bunu, yerleştirmeler oluştururken yaptığımız gibi yapın.
Vektör arama algoritması olarak kosinüs uzaklığını kullanarak "Burada hangi meyve ağaçları iyi yetişir?" gibi bir istekle eşleşen en iyi 5 ürünü bulalım.
psql oturumunda şunları yürütün:
SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
(ce.embedding <=> google_ml.embedding('bge-base-1.5','What kind of fruit trees grow well here?')::vector) as distance
FROM
cymbal_products cp
JOIN cymbal_embedding ce on
ce.uniq_id=cp.uniq_id
JOIN cymbal_inventory ci on
ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
cs.store_id=ci.store_id
AND ci.inventory>0
AND cs.store_id = 1583
ORDER BY
distance ASC
LIMIT 5;
Beklenen konsol çıkışı:
demo=# SELECT cp.product_name, left(cp.product_description,80) as description, cp.sale_price, cs.zip_code, (ce.embedding <=> google_ml.embedding('bge-base-1.5','What kind of fruit trees grow well here?')::vector) as distance FROM cymbal_products cp JOIN cymbal_embedding ce on ce.uniq_id=cp.uniq_id JOIN cymbal_inventory ci on ci.uniq_id=cp.uniq_id JOIN cymbal_stores cs on cs.store_id=ci.store_id AND ci.inventory>0 AND cs.store_id = 1583 ORDER BY distance ASC LIMIT 5; product_name | description | sale_price | zip_code | distance -----------------------+----------------------------------------------------------------------------------+------------+----------+--------------------- California Sycamore | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is | 300.00 | 93230 | 0.22753925487632942 Toyon | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e | 10.00 | 93230 | 0.23497374266229387 California Peppertree | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e | 25.00 | 93230 | 0.24215884459965364 California Redwood | This is a beautiful redwood tree that can grow to be over 300 feet tall. It is a | 1000.00 | 93230 | 0.24564130578287147 Cherry Tree | This is a beautiful cherry tree that will produce delicious cherries. It is an d | 75.00 | 93230 | 0.24846117929767153 (5 rows) Time: 28.724 ms demo=#
Sorgu 28 ms çalıştı ve cymbal_products tablosundaki istekle eşleşen ve 1583 numaralı mağazada bulunan envanteri içeren bir ağaç listesi döndürdü.
ANN dizini oluşturma
Yalnızca küçük bir veri kümemiz olduğunda tüm yerleştirmeleri tarayan tam aramayı kullanmak kolaydır ancak veriler arttığında yükleme ve yanıt süresi de artar. Performansı artırmak için yerleştirme verilerinizle dizinler oluşturabilirsiniz. Vektör verileri için Google ScaNN dizini kullanılarak bu işlemin nasıl yapılacağına dair bir örnek aşağıda verilmiştir.
Bağlantıyı kaybettiyseniz demo veritabanına yeniden bağlanın:
psql "host=$INSTANCE_IP user=postgres sslmode=require dbname=demo"
alloydb_scann uzantısını etkinleştirin:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Dizini oluşturun:
CREATE INDEX cymbal_embedding_scann ON cymbal_embedding USING scann (embedding cosine);
Öncekiyle aynı sorguyu deneyin ve sonuçları karşılaştırın:
demo=# SELECT cp.product_name, left(cp.product_description,80) as description, cp.sale_price, cs.zip_code, (ce.embedding <=> google_ml.embedding('bge-base-1.5','What kind of fruit trees grow well here?')::vector) as distance FROM cymbal_products cp JOIN cymbal_embedding ce on ce.uniq_id=cp.uniq_id JOIN cymbal_inventory ci on ci.uniq_id=cp.uniq_id JOIN cymbal_stores cs on cs.store_id=ci.store_id AND ci.inventory>0 AND cs.store_id = 1583 ORDER BY distance ASC LIMIT 5; product_name | description | sale_price | zip_code | distance -----------------------+----------------------------------------------------------------------------------+------------+----------+--------------------- California Sycamore | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is | 300.00 | 93230 | 0.22753925487632942 Toyon | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e | 10.00 | 93230 | 0.23497374266229387 California Peppertree | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e | 25.00 | 93230 | 0.24215884459965364 California Redwood | This is a beautiful redwood tree that can grow to be over 300 feet tall. It is a | 1000.00 | 93230 | 0.24564130578287147 Fremont Cottonwood | This is a beautiful cottonwood tree that can grow to be over 100 feet tall. It i | 200.00 | 93230 | 0.2533482837690365 (5 rows) Time: 14.665 ms demo=#
Sorgu yürütme süresi biraz azaldı ve bu kazanç daha büyük veri kümelerinde daha belirgin olacaktır. Sonuçlar oldukça benzer. Yalnızca Kiraz, Fremont Cottonwood ile değiştirildi.
Başka sorgular deneyin ve dokümanlar bölümünden vektör dizini seçme hakkında daha fazla bilgi edinin.
AlloyDB Omni'nin daha fazla özellik ve laboratuvar sunduğunu unutmayın.
8. Ortamı temizleme
Artık AlloyDB Omni ve bir yapay zeka modeliyle GKE kümemizi silebiliriz.
GKE kümesini silme
Cloud Shell'de şunları çalıştırın:
export PROJECT_ID=$(gcloud config get project)
export LOCATION=us-central1
export CLUSTER_NAME=alloydb-ai-gke
gcloud container clusters delete ${CLUSTER_NAME} \
--project=${PROJECT_ID} \
--region=${LOCATION}
Beklenen konsol çıkışı:
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
Sanal makineyi silme
Cloud Shell'de şunları çalıştırın:
export PROJECT_ID=$(gcloud config get project)
export ZONE=us-central1-a
gcloud compute instances delete instance-1 \
--project=${PROJECT_ID} \
--zone=${ZONE}
Beklenen konsol çıkışı:
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
Bu kod laboratuvarı için yeni bir proje oluşturduysanız projenin tamamını silebilirsiniz: https://console.cloud.google.com/cloud-resource-manager
9. Tebrikler
Codelab'i tamamladığınız için tebrikler.
Ele aldığımız konular
- AlloyDB Omni'yi Google Kubernetes kümesine dağıtma
- AlloyDB Omni'ye bağlanma
- AlloyDB Omni'ye veri yükleme
- Açık yerleşik modelleri GKE'ye dağıtma
- AlloyDB Omni'ye yerleştirme modelini kaydetme
- Semantik arama için yerleştirilmiş öğeler oluşturma
- AlloyDB Omni'de semantik arama için oluşturulan yerleştirilmiş öğeleri kullanma
- AlloyDB'de vektör dizini oluşturma ve kullanma
AlloyDB Omni'de yapay zeka ile çalışma hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.