Как использовать функции Cloud Run и Gemini для обобщения текстового файла, загруженного в корзину Cloud Storage.

1. Введение

Обзор

Функции Cloud Run — это новый способ развертывания рабочих нагрузок с использованием знакомых парадигм обработки событий GCF и сигнатур функций. Вместо использования нашего самоуверенного процесса сборки и конфигураций развертывания функции Cloud Run дают вам прямой контроль над базовой Службой, созданной в Cloud Run.

В этом разделе вы узнаете, как развернуть в Python функцию, управляемую событиями, которая использует Gemini для суммирования обычного текстового файла, загруженного в корзину Cloud Storage.

Что вы узнаете

  • Как развернуть функцию Cloud Run, управляемую событиями, которая срабатывает каждый раз, когда объект загружается в корзину GCS.
  • Как создать учетную запись службы с соответствующими ролями для получения событий из Cloud Storage и вызова функции Cloud Run
  • Как использовать Gemini для обобщения обычного текстового документа, загруженного в Cloud Storage

2. Настройте переменные среды и включите API.

Обновить интерфейс командной строки gcloud

Для этой лаборатории кода требуется последняя версия установленного интерфейса командной строки gcloud. Вы можете обновить CLI, запустив

gcloud components update

Включить API

Прежде чем вы сможете начать использовать эту кодовую лабораторию, вам необходимо включить несколько API. Для этой лаборатории кода требуется использование следующих API. Вы можете включить эти API, выполнив следующую команду:

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

Настройка переменных среды

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

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. Создайте сегмент хранения и учетную запись службы.

Создайте сегмент хранения

Вы можете создать корзину Cloud Storage, выполнив следующую команду:

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

Создать учетную запись службы

В этом примере вы создадите учетную запись службы с необходимыми разрешениями EventArc и ролью инициатора Cloud Run, чтобы получать события из Cloud Storage и вызывать функцию Cloud Run.

Сначала создайте учетную запись службы.

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"

Затем предоставьте роль получателя событий Eventarc (roles/eventarc.eventReceiver) в проекте учетной записи службы, связанной с вашим триггером Eventarc, чтобы триггер мог получать события от поставщиков событий.

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

Затем предоставьте сервисному аккаунту роль инициатора Cloud Run, чтобы он мог вызывать функцию.

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

Теперь предоставьте сервисной учетной записи роль пользователя платформы AI, чтобы она могла совершать вызовы в Gemini.

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

И предоставьте учетной записи службы роль средства просмотра объектов хранилища, чтобы она могла получить доступ к файлу.

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

Cloud Pub/Sub необходима роль roles/iam.serviceAccountTokenCreator в вашем проекте для создания токенов удостоверения.

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

Для вашего триггера требуется роль roles/pubsub.publisher, предоставленная учетной записи службы Google Cloud Storage, чтобы получать события через Cloud Storage.

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

4. Создайте и разверните функцию

Сначала создайте каталог для исходного кода и перейдите в этот каталог.

mkdir $SERVICE_NAME && cd $_

Затем создайте файл requirements.txt со следующим содержимым:

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

Затем создайте файл main.py со следующим содержимым:

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

Теперь вы можете развернуть функцию Cloud Run, выполнив следующую команду:

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

Обратите внимание на следующее:

  • флаг --source используется, чтобы сообщить Cloud Run о необходимости создания функции в работоспособном сервисе на основе контейнера.
  • флаг --function (новый) используется для установки точки входа новой службы в качестве сигнатуры функции, которую вы хотите вызвать.
  • (необязательно) --no-allow-unauthenticated чтобы предотвратить публичный вызов вашей функции

Вас могут спросить: «Для развертывания из исходного кода требуется репозиторий Docker Artifact Registry для хранения собранных контейнеров. Будет создан репозиторий с именем [cloud-run-source-deploy] в регионе [<ВАШ_РЕГИОН>]. Примите значение «да» по умолчанию, чтобы создать репозиторий.

Вы можете просмотреть свой новый сервис crf-vertexai-codelab выполнив следующую команду:

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

5. Создайте мероприятие

Мы можем создать триггер Eventarc для отправки сообщений в нашу функцию каждый раз, когда объект завершается в Google Cloud Storage:

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

Обратите внимание, что для флага --event-filters не используйте префикс gs:// в имени корзины.

Если вы видите ошибку If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent. пожалуйста, подождите несколько минут, прежде чем повторить попытку.

Подробное руководство по настройке службы Trigger из облачного хранилища с помощью Eventarc можно найти в документации Cloud Run здесь: https://cloud.google.com/run/docs/tutorials/eventarc.

6. Проверьте функцию

Когда наша функция развернута и создан триггер, мы готовы вызвать функцию.

Создайте файл и загрузите его в корзину Cloud Storage. Вы можете сделать это через веб-интерфейс Cloud Console или с помощью инструмента командной строки gsutil, например

gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME

Когда файл будет успешно загружен, будет сгенерировано событие, и ваша функция вызовет Gemini для суммирования обычного текстового файла. Сводка будет напечатана в журналах.

Вы можете просмотреть журналы в облачной консоли службы Cloud Run или выполнить следующую команду:

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

Например, загрузка обычного текстового файла руководства пользователя по функциям Cloud Run для частного предварительного просмотра приводит к следующему результату, печатаемому в журналах:

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. Поздравляем!

Поздравляем с завершением работы над кодом!

Рекомендуем просмотреть документацию по функциям Cloud Run.

Что мы рассмотрели

  • Как развернуть функцию Cloud Run, управляемую событиями, которая срабатывает каждый раз, когда объект загружается в корзину GCS.
  • Как создать учетную запись службы с соответствующими ролями для получения событий из Cloud Storage и вызова функции Cloud Run
  • Как использовать Gemini для обобщения обычного текстового документа, загруженного в Cloud Storage

8. Очистка

Чтобы избежать непреднамеренных расходов (например, если эта услуга Cloud Run случайно вызывается больше раз, чем выделено ежемесячное количество вызовов Cloud Run на уровне бесплатного пользования ), вы можете либо удалить службу Cloud Run, либо удалить проект, созданный на шаге 2.

Чтобы удалить службы Cloud Run, перейдите в облачную консоль Cloud Run по адресу https://console.cloud.google.com/run/ и удалите службу crf-vertexai-codelab созданную в этой лаборатории кода.

Если вы решите удалить весь проект, вы можете перейти на https://console.cloud.google.com/cloud-resource-manager , выбрать проект, созданный на шаге 2, и нажать «Удалить». Если вы удалите проект, вам придется изменить проекты в Cloud SDK. Вы можете просмотреть список всех доступных проектов, запустив gcloud projects list .