1. Введение
Обзор
Функция удаленного доступа BigQuery позволяет реализовать функцию на языках, отличных от SQL и JavaScript, или с использованием библиотек и сервисов, не разрешенных в пользовательских функциях BigQuery. Функция удаленного доступа BigQuery обеспечивает прямую интеграцию с функциями Cloud Run и Cloud Run . Вы можете вызвать функцию удаленного доступа BigQuery в SQL-запросе, приняв на вход один или несколько столбцов, а затем вернув одно значение на выходе.
Cloud Run Functions — это легковесное вычислительное решение для разработчиков, позволяющее создавать автономные функции, выполняющие одну задачу, которые могут запускаться по протоколу HTTPS или реагировать на события CloudEvents без необходимости управления сервером или средой выполнения. Cloud Run Functions поддерживает Node.js, Python, Go, Java, .NET, Ruby и PHP.
В этом практическом занятии вы научитесь создавать удаленную функцию BigQuery для получения ответов на вопросы об изображениях, хранящихся в Cloud Storage, с помощью системы визуального ответа на вопросы (VQA) Vertex AI. Ваш SQL-запрос будет извлекать URI изображения из таблицы в BigQuery. Затем, используя удаленную функцию BigQuery, вы отправите URI изображения в функцию Cloud Run, которая вернет вам ответы от VQA об изображении.
Иллюстрация

С точки зрения разработки, в этом практическом занятии вы выполните следующие шаги:
- Создайте HTTP-конечную точку в функциях Cloud Run.
- Создайте соединение типа CLOUD_RESOURCE
- Создайте объектную таблицу BigQuery для сегмента Cloud Storage.
- Создайте удаленную функцию
- Используйте удаленную функцию в запросе так же, как и любые другие пользовательские функции.
Что вы узнаете
- Как создать функцию HTTP Cloud Run на Python
- Как создать и использовать удаленную функцию BigQuery в SQL-запросе
- Как создать объектную таблицу в BigQuery
- Как использовать SDK Vertex AI для Python для визуального ответа на вопросы (VQA)
2. Настройка и требования
Предварительные требования
- Вы вошли в облачную консоль.
- Вы ранее развернули функцию HTTP Cloud Run. См. руководство по быстрому запуску Python .
- Вы ранее создали корзину в Cloud Storage. См. раздел «Быстрый старт в Cloud Storage» .
- У вас есть соответствующие роли для создания набора данных, таблицы и удаленной функции в BigQuery. См. раздел «Загрузка и запрос данных в BigQuery» в кратком руководстве .
Активировать Cloud Shell
- В консоли Cloud нажмите «Активировать Cloud Shell» .
.

Если вы запускаете Cloud Shell впервые, вам будет показан промежуточный экран с описанием его возможностей. Если вы увидели промежуточный экран, нажмите «Продолжить» .

Подготовка и подключение к Cloud Shell займут всего несколько минут.

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, ваша работа в этом практическом задании может быть выполнена с помощью браузера.
После подключения к Cloud Shell вы увидите, что прошли аутентификацию и что проект настроен на ваш идентификатор проекта.
- Выполните следующую команду в Cloud Shell, чтобы подтвердить свою аутентификацию:
gcloud auth list
вывод команды
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:
gcloud config list project
вывод команды
[core] project = <PROJECT_ID>
Если это не так, вы можете установить это с помощью следующей команды:
gcloud config set project <PROJECT_ID>
вывод команды
Updated property [core/project].
3. Настройка локальных переменных среды.
В этом коде вы создадите несколько переменных окружения для улучшения читаемости команд gcloud , используемых в этом практическом задании.
PROJECT_ID=$(gcloud config get-value project) # Cloud Function variables FUNCTION_NAME="imagen-vqa" FUNCTION_REGION="us-central1" # Cloud Function variables BUCKET_NAME=$PROJECT_ID-imagen-vqa # BigQuery variables DATASET_ID="remote_function_codelab" TABLE_NAME="images" BQ_REGION="US" CONNECTION_ID="imagen_vqa_connection"
4. Создайте функцию Cloud Run.
Для создания удаленной функции BigQuery необходимо сначала создать HTTP-конечную точку с помощью функции Cloud Run. Конечная точка должна уметь обрабатывать пакет строк в одном HTTP POST-запросе и возвращать результаты для этого пакета в качестве HTTP-ответа.
Эта функция Cloud Run получит URI хранилища изображений и подсказку вопроса в качестве входных данных из вашего SQL-запроса и вернет ответ от системы визуального ответа на вопросы (VQA).
В этом практическом занятии используется пример работы с средой выполнения Python311 с помощью Vertex AI SDK для Python .
Создайте исходный код для функции.
Сначала создайте директорию и перейдите в неё с помощью команды `cd`.
mkdir imagen-vqa && cd $_
Затем создайте файл requirements.txt .
google-cloud-aiplatform[preview] google-cloud-storage functions-framework==3.*
Далее создайте исходный файл main.py
from vertexai.preview.vision_models import ImageQnAModel
from vertexai.preview.vision_models import Image
from flask import jsonify
from google.cloud import storage
from urllib.parse import urlparse
import functions_framework
# This is the entry point for the cloud function
@functions_framework.http
def imagen_vqa(request):
try:
# See if you can parse the incoming JSON
return_value = []
request_json = request.get_json()
# This grabs the input into the function as called from the SQL function
calls = request_json['calls']
for call in calls:
# We call the VQA function here in another function defined below
ai_result = vqa(call)
# The result to BigQuery is in the order it was prepared in
return_value.append(ai_result[0])
# Prepare the response back to BigQuery
return_json = jsonify( { "replies": return_value } )
return return_json
except Exception as e:
return jsonify( { "errorMessage": str(e) } ), 400
# Helper function to split apart the GCS URI
def decode_gcs_url(url):
# Read the URI and parse it
p = urlparse(url)
bucket = p.netloc
file_path = p.path[0:].split('/', 1)
# Return the relevant objects (bucket, path to object)
return bucket, file_path[1]
# We can't use the image load from local file since it expects a local path
# We use a GCS URL and get the bytes of the image
def read_file(object_path):
# Parse the path
bucket, file_path = decode_gcs_url(object_path)
storage_client = storage.Client()
bucket = storage_client.bucket(bucket)
blob = bucket.blob(file_path)
# Return the object as bytes
return blob.download_as_bytes()
# This is the function that calls the VQA function
def vqa (parameters):
# This is the model we want to use
image_qna_model = ImageQnAModel.from_pretrained("imagetext@001")
# The location is the first parameter
image_loc = parameters[0]
# Get the bytes
image_bytes = read_file(image_loc)
# Load the bytes into the Image handler
input_image = Image(image_bytes)
# Ask the VQA the question
results = image_qna_model.ask_question(
image=input_image,
# The prompt was the second parameter
question=parameters[1],
number_of_results=1
)
return results
Разверните функцию Cloud Run.
Теперь вы можете развернуть свою функцию Cloud Run для среды выполнения python311.
Чтобы развернуть функцию Cloud Run непосредственно в Cloud Run, выполните следующую команду:
gcloud beta run deploy $FUNCTION_NAME \
--source . \
--function imagen_vqa \
--region $FUNCTION_REGION \
--no-allow-unauthenticated
Если вы предпочитаете развертывание в качестве Cloud Functions 2-го поколения, используйте следующую команду:
gcloud functions deploy $FUNCTION_NAME \ --gen2 \ --region=$FUNCTION_REGION \ --runtime=python311 \ --trigger-http \ --source=. \ --no-allow-unauthenticated
Затем вы можете сохранить URL-адрес функции в качестве переменной среды для дальнейшего использования.
ENDPOINT_URL="$(gcloud beta run services describe $FUNCTION_NAME --region $FUNCTION_REGION --format='value(status.url)')"
5. Создайте сегмент облачного хранилища.
Сначала создайте хранилище Cloud Storage для ваших изображений.
gcloud storage buckets create gs://$BUCKET_NAME
Далее загрузите изображение для использования VQA. В этом практическом задании используется пример изображения из документации VQA .
Вы можете либо использовать консоль Cloud Console для Cloud Storage, чтобы загрузить образ непосредственно в свой бакет. Или вы можете выполнить следующие команды, чтобы загрузить пример образа в текущий каталог Cloud Shell.
wget -O image.jpg -o /dev/null https://unsplash.com/photos/QqN25A3iF9w/download?ixid=M3wxMjA3fDB8MXxhbGx8fHx8fHx8fHwxNjk1NzYxMjY2fA&force=true
а затем загрузить в свой облачный накопитель.
gcloud storage cp image.jpg gs://$BUCKET_NAME
6. Создайте подключение к облачному ресурсу BigQuery.
BigQuery использует соединение CLOUD_RESOURCE для взаимодействия с вашей облачной функцией. Выполните следующую команду, чтобы создать это соединение.
bq mk --connection --location=$BQ_REGION --project_id=$PROJECT_ID \ --connection_type=CLOUD_RESOURCE $CONNECTION_ID
Далее отобразите подробную информацию о новом подключении к BigQuery.
bq show --connection $PROJECT_ID.$BQ_REGION.$CONNECTION_ID
Сохраните имя учетной записи службы подключения BigQuery в переменную, как показано на рисунке.
CONNECTION_SA="<YOUR-SERVICE-ACCOUNT-ID>@gcp-sa-bigquery-condel.iam.gserviceaccount.com"
Предоставьте учетной записи службы доступ к вашему сегменту облачного хранилища.
gsutil iam ch serviceAccount:$CONNECTION_SA:objectAdmin gs://$BUCKET_NAME
7. Создайте объектную таблицу BigQuery.
Объектные таблицы BigQuery — это таблицы только для чтения, содержащие неструктурированные объекты данных, которые хранятся в облачном хранилище.
Объектные таблицы позволяют анализировать неструктурированные данные в Cloud Storage. Вы можете выполнять анализ с помощью удаленных функций, а затем объединять результаты этих операций с остальными структурированными данными в BigQuery.
Сначала создайте набор данных.
bq --location=$BQ_REGION mk \
--dataset \
$DATASET_ID
Следующая команда создает таблицу объектов на основе вашего сегмента изображений в Cloud Storage. Полученная таблица будет содержать URI всех изображений в этом сегменте.
bq mk --table \ --external_table_definition=gs://$BUCKET_NAME/*@$BQ_REGION.$CONNECTION_ID \ --object_metadata=SIMPLE \ $PROJECT_ID:$DATASET_ID.$TABLE_NAME
8. Создайте удаленную функцию BigQuery.
Последний шаг — это настройка удаленной функции BigQuery.
Во-первых, предоставьте учетной записи службы подключения BigQuery разрешения на вызов функции Cloud Run. Не рекомендуется разрешать неаутентифицированный вызов функции Cloud Run.
gcloud run services add-iam-policy-binding $FUNCTION_NAME \ --member=serviceAccount:$CONNECTION_SA \ --role="roles/run.invoker" \ --region $FUNCTION_REGION
Далее сохраните SQL-запрос в переменную.
SQL_CREATE_FUNCTION="CREATE FUNCTION \`$PROJECT_ID.$DATASET_ID\`.vqa(uri STRING, image_prompt STRING) RETURNS STRING REMOTE WITH CONNECTION \`$PROJECT_ID.$BQ_REGION.$CONNECTION_ID\` OPTIONS ( endpoint = '$ENDPOINT_URL' )"
А теперь выполните запрос.
bq query --nouse_legacy_sql $SQL_CREATE_FUNCTION
После выполнения запроса на создание удаленной функции вы увидите сообщение Created <your-project-id>.remote_function_codelab.vqa
9. Вызов удаленной функции BigQuery в SQL-запросе
Вы завершили этапы разработки для создания удаленной функции. Теперь вы можете вызывать свою функцию Cloud Run из SQL-запроса.
Сначала сохраните свой вопрос и SQL-запрос в переменную. В этом практическом занятии используется пример из документации по визуальному ответу на вопросы. Этот запрос использует последнее изображение, добавленное в ваше хранилище.
export SQL_QUERY="DECLARE question STRING DEFAULT 'What objects are in the image?'; SELECT uri, image_prompt ,\`$DATASET_ID\`.vqa(uri, image_prompt) as result FROM ( SELECT *, dense_rank() over (order by updated) as rnk , question as image_prompt FROM \`$PROJECT_ID.$DATASET_ID.images\`) as innertable WHERE rnk = 1; "
Затем выполните SQL-запрос, чтобы отобразить ответ от сервиса визуального ответа на вопросы (VQA) Vertex AI.
bq query --nouse_legacy_sql $SQL_QUERY
Результаты должны выглядеть примерно так, как показано в приведенном ниже примере:
+---------------------------------+--------------------------------+----------+ | uri | image_prompt | result | +---------------------------------+--------------------------------+----------+ | gs://<YOUR_BUCKET>/image.jpg | What objects are in the image? | marbles | +---------------------------------+--------------------------------+----------+
10. Устранение неполадок
При создании таблицы BigQuery, если вы получаете ошибку BigQuery error in mk operation: Source URI must be a Google Cloud Storage location: gs://$BUCKET_NAME убедитесь, что вы добавили путь /* после $BUCKET_NAME в команду.
Если при выполнении SQL-запроса вы получаете ошибку Access Denied: BigQuery BigQuery: Received response code 403 from endpoint <your-function-endpoint> , попробуйте подождать около 1-2 минут, пока разрешение роли Cloud Function Invoker не распространится на учетную запись службы подключения BigQuery, прежде чем повторять попытку.
11. Поздравляем!
Поздравляем с завершением практического занятия!
Мы рекомендуем ознакомиться с документацией по BigQuery Remote Functions и Visual Question Answering (VQA) .
Что мы рассмотрели
- Как настроить аутентификацию в функции Cloud Run и проверить правильность ее настройки.
- Вызовите аутентифицированную функцию из локальной среды разработки, предоставив токен для вашей учетной записи gcloud.
- Как создать учетную запись службы и предоставить ей соответствующую роль для вызова функции?
- Как имитировать работу сервиса из локальной среды разработки, имеющей соответствующие роли для вызова функции.
12. Уборка
Чтобы избежать непреднамеренных списаний средств (например, если эта функция Cloud Run будет случайно вызвана больше раз, чем предусмотрено вашим ежемесячным лимитом вызовов функций Cloud Run в бесплатном тарифе ), вы можете либо удалить функцию Cloud Function, либо удалить проект, созданный на шаге 2.
Чтобы удалить функцию Cloud Run, перейдите в консоль Cloud Run по адресу https://console.cloud.google.com/functions/ и удалите функцию imagen-vqa (или переменную $FUNCTION_NAME, если вы использовали другое имя).
Если вы решите удалить весь проект, перейдите по ссылке https://console.cloud.google.com/cloud-resource-manager , выберите проект, созданный на шаге 2, и нажмите «Удалить». После удаления проекта вам потребуется изменить проекты в вашем Cloud SDK. Список всех доступных проектов можно просмотреть, выполнив gcloud projects list .