Cloud Storage paketine yüklenen bir metin dosyasını özetlemek için Cloud Run işlevlerini ve Gemini'ı kullanma

1. Giriş

Genel Bakış

Cloud Run işlevleri, tanıdık GCF etkinlik paradigmalarını ve işlev imzasını kullanarak iş yüklerini dağıtmanın yeni bir yoludur. Cloud Run işlevleri, kendi görüşlerimize dayalı derleme sürecimizi ve dağıtım yapılandırmalarımızı kullanmak yerine Cloud Run'da oluşturulan temel hizmet üzerinde doğrudan kontrol sahibi olmanızı sağlar.

Bu bölümde, Cloud Storage paketine yüklenen bir düz metin dosyasını özetlemek için Gemini'ı kullanan, Python'da yazılmış, etkinliğe dayalı bir işlevi nasıl dağıtacağınızı öğreneceksiniz.

Neler öğreneceksiniz?

  • Bir GCS paketine nesne yüklendiğinde tetiklenen, etkinliğe dayalı bir Cloud Run işlevini dağıtma
  • Cloud Storage'dan etkinlik almak ve Cloud Run işlevini çağırmak için uygun rollere sahip bir hizmet hesabı oluşturma
  • Cloud Storage'a yüklenen bir düz metin belgesini özetlemek için Gemini'ı kullanma

2. Ortam değişkenlerini ayarlama ve API'leri etkinleştirme

gcloud CLI'yı güncelleme

Bu codelab için gcloud CLI'nin yeni bir sürümünün yüklü olması gerekir. KSA'yı güncellemek için şu komutu çalıştırabilirsiniz:

gcloud components update

API'leri etkinleştir

Bu codelab'i kullanmaya başlamadan önce etkinleştirmeniz gereken birkaç API vardır. Bu codelab'de aşağıdaki API'lerin kullanılması gerekir. Bu API'leri aşağıdaki komutu çalıştırarak etkinleştirebilirsiniz:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    storage.googleapis.com \
    artifactregistry.googleapis.com \
    eventarc.googleapis.com \
    aiplatform.googleapis.com

Ortam değişkenlerini ayarlama

Bu codelab boyunca kullanılacak ortam değişkenlerini ayarlayabilirsiniz.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>

gcloud config set project $PROJECT_ID
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
SERVICE_NAME=crf-vertexai-codelab
BUCKET_NAME=$PROJECT_ID-$SERVICE_NAME
TRIGGER_NAME=$SERVICE_NAME-trigger

3. Storage paketi ve hizmet hesabı oluşturma

Storage paketi oluşturma

Aşağıdaki komutu çalıştırarak bir Cloud Storage paketi oluşturabilirsiniz:

gsutil mb -l us-central1 gs://$BUCKET_NAME

Hizmet hesabı oluşturma

Bu örnekte, Cloud Storage'dan etkinlik almak ve Cloud Run işlevini çağırmak için gerekli Eventarc izinlerine ve Cloud Run çağıran rolüne sahip bir hizmet hesabı oluşturacaksınız.

Öncelikle hizmet hesabını oluşturun.

SERVICE_ACCOUNT="crf-vertexai-codelab"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run functions Eventarc service account"

Ardından, tetikleyicinin etkinlik sağlayıcılardan etkinlik alabilmesi için projede Eventarc Etkinlik Alıcısı rolünü (roles/eventarc.eventReceiver) Eventarc tetikleyicinizle ilişkili hizmet hesabına verin.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/eventarc.eventReceiver

Ardından, hizmet hesabına Cloud Run Invoker rolünü vererek işlevi çağırmasına izin verin.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

Şimdi, hizmet hesabına Gemini'a çağrı yapabilmesi için AI Platform Kullanıcısı rolünü verin.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --role="roles/aiplatform.user"

Ayrıca, hizmet hesabına Storage Object Viewer rolünü vererek dosyaya erişmesini sağlayın.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --role="roles/storage.objectViewer"

Cloud Pub/Sub'ın kimlik jetonları oluşturabilmesi için projenizde roles/iam.serviceAccountTokenCreator rolüne sahip olması gerekir.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role=roles/iam.serviceAccountTokenCreator

Tetikleyicinizin, Cloud Storage aracılığıyla etkinlikleri alabilmesi için Google Cloud Storage hizmet hesabına roles/pubsub.publisher rolünün verilmesi gerekiyor.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:service-$PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com \
  --role=roles/pubsub.publisher

4. İşlevi oluşturma ve dağıtma

Öncelikle kaynak kodu için bir dizin oluşturun ve bu dizine gidin.

mkdir $SERVICE_NAME && cd $_

Ardından, aşağıdaki içeriğe sahip bir requirements.txt dosyası oluşturun:

functions-framework==3.*
google-cloud-aiplatform==1.63.*
google-cloud-storage==2.16.*

Ardından, aşağıdaki içeriğe sahip bir main.py dosyası oluşturun:

import functions_framework
import vertexai
from vertexai.generative_models import GenerativeModel
from google.cloud import storage

vertexai.init(project="<YOUR_PROJECT_ID>", location="us-central1")

model = GenerativeModel(
    model_name="gemini-1.5-pro-001",
    system_instruction=[
        "Summarize the following document in a single sentence. Do not respond with more than one sentence.",
    ],
)

# Triggered by a change in a storage bucket
@functions_framework.cloud_event
def hello_gcs(cloud_event):
    data = cloud_event.data

    # download the file
    storage_client = storage.Client()
    blob = storage_client.bucket(data["bucket"]).get_blob(data["name"])
    #print(blob)

    doc = blob.download_as_text()
    contents = [doc]

    response = model.generate_content(contents)
    print(response.text)

    print(f"Response from Model: {response.text}")

Şimdi aşağıdaki komutu çalıştırarak Cloud Run işlevini dağıtabilirsiniz:

gcloud beta run deploy $SERVICE_NAME \
      --source . \
      --function hello_gcs \
      --region $REGION \
      --no-allow-unauthenticated \
      --service-account $SERVICE_ACCOUNT_ADDRESS

Lütfen şunları unutmayın:

  • --source işareti, Cloud Run'a işlevi çalıştırılabilir bir kapsayıcı tabanlı hizmet olarak oluşturmasını söylemek için kullanılır.
  • --function işareti (yeni), yeni hizmetin giriş noktasını çağrılmasını istediğiniz işlev imzası olarak ayarlamak için kullanılır.
  • (isteğe bağlı) İşlevinizin herkese açık olarak çağrılmasını önlemek için --no-allow-unauthenticated

"Kaynaktan dağıtım için derlenen container'ları depolamak üzere bir Artifact Registry Docker deposu gerekir. [<YOUR_REGION>] bölgesinde [cloud-run-source-deploy] adlı bir depo oluşturulacak." Depoyu oluşturmak için varsayılan "evet"i kabul edin.

Aşağıdaki komutu çalıştırarak yeni hizmetinizi crf-vertexai-codelab görüntüleyebilirsiniz:

gcloud beta run services describe $SERVICE_NAME --region $REGION

5. Etkinlik oluşturma

Google Cloud Storage'da bir nesne sonlandırıldığında işlevimize mesaj göndermek için bir Eventarc tetikleyicisi oluşturabiliriz:

BUCKET_REGION=$REGION

gcloud eventarc triggers create $TRIGGER_NAME \
     --location=$REGION \
     --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$BUCKET_REGION \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=$BUCKET_NAME" \
     --service-account=$SERVICE_ACCOUNT_ADDRESS

Lütfen --event-filters işareti için paket adınızda gs:// ön ekini kullanmadığınızdan emin olun.

If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent. hatasını görüyorsanız lütfen tekrar denemeden önce birkaç dakika bekleyin.

Eventarc'ı kullanarak Cloud Storage'dan tetikleyici hizmeti ayarlama hakkında ayrıntılı bir eğitime Cloud Run belgelerinden ulaşabilirsiniz: https://cloud.google.com/run/docs/tutorials/eventarc

6. İşlevi test etme

İşlevimiz dağıtıldığı ve tetikleyici oluşturulduğu için artık işlevi çağırmaya hazırız.

Bir dosya oluşturun ve Cloud Storage paketinize yükleyin. Bu işlemi Cloud Console web arayüzü üzerinden veya gsutil KSA aracını kullanarak yapabilirsiniz. Örneğin:

gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME

Dosya başarıyla yüklendiğinde bir etkinlik oluşturulur ve işleviniz, düz metin dosyasını özetlemek için Gemini'ı çağırır. Özet, günlüklerde yazdırılır.

Günlükleri Cloud Run hizmeti için Cloud Console'da görüntüleyebilir veya aşağıdaki komutu çalıştırabilirsiniz:

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE_NAME AND textPayload: Response"

Örneğin, özel önizleme için Cloud Run Functions kullanıcı kılavuzunun düz metin dosyasını yüklediğinizde günlüklerde aşağıdakiler yazdırılır:

Response from Model: Cloud Run functions offer a new way to deploy serverless workloads with familiar Google Cloud Functions paradigms while providing control over the underlying Cloud Run service. 

7. Tebrikler!

Tebrikler, codelab'i tamamladınız.

Cloud Run işlevleriyle ilgili dokümanları incelemenizi öneririz.

İşlediğimiz konular

  • Bir GCS paketine nesne yüklendiğinde tetiklenen, etkinliğe dayalı bir Cloud Run işlevini dağıtma
  • Cloud Storage'dan etkinlik almak ve Cloud Run işlevini çağırmak için uygun rollere sahip bir hizmet hesabı oluşturma
  • Cloud Storage'a yüklenen bir düz metin belgesini özetlemek için Gemini'ı kullanma

8. Temizleme

Yanlışlıkla ücretlendirilmemek için (örneğin, bu Cloud Run hizmeti ücretsiz katmandaki aylık Cloud Run çağırma tahsisinizden daha fazla sayıda yanlışlıkla çağrılırsa) Cloud Run hizmetini veya 2. adımda oluşturduğunuz projeyi silebilirsiniz.

Cloud Run hizmetlerini silmek için https://console.cloud.google.com/run/ adresinden Cloud Run Cloud Console'a gidin ve bu codelab'de oluşturduğunuz crf-vertexai-codelab hizmetini silin.

Projenin tamamını silmeyi tercih ederseniz https://console.cloud.google.com/cloud-resource-manager adresine gidebilir, 2. adımda oluşturduğunuz projeyi seçip Sil'i tıklayabilirsiniz. Projeyi silerseniz Cloud SDK'nızda projeleri değiştirmeniz gerekir. gcloud projects list komutunu çalıştırarak kullanılabilir tüm projelerin listesini görüntüleyebilirsiniz.