از توابع راه دور BigQuery برای پرسیدن سؤالات به Vertex AI Visual Question Answering (VQA) در پرس و جوی SQL استفاده کنید.

1. مقدمه

نمای کلی

توابع راه دور BigQuery به شما امکان می دهد یک تابع را به زبان هایی غیر از SQL و جاوا اسکریپت یا با کتابخانه ها و سرویس هایی که در توابع تعریف شده توسط کاربر BigQuery مجاز نیستند پیاده سازی کنید. توابع راه دور BigQuery یک ادغام مستقیم با توابع Cloud Run و Cloud Run فراهم می کنند. می‌توانید با گرفتن یک یا چند ستون به‌عنوان ورودی و سپس برگرداندن یک مقدار واحد به‌عنوان خروجی، یک تابع راه دور BigQuery را در یک پرس و جوی SQL فراخوانی کنید.

توابع Cloud Run یک راه حل محاسباتی سبک برای توسعه دهندگان برای ایجاد توابع تک منظوره و مستقل است که می توانند با استفاده از HTTPS فعال شوند یا به CloudEvents بدون نیاز به مدیریت سرور یا محیط زمان اجرا پاسخ دهند. توابع Cloud Run از Node.js، Python، Go، Java، .NET، Ruby و PHP پشتیبانی می کنند.

در این کد لبه، یاد خواهید گرفت که چگونه یک تابع از راه دور BigQuery ایجاد کنید تا به سؤالی در مورد تصاویر ذخیره شده در فضای ابری با استفاده از Vertex AI Visual Question Answering (VQA) پاسخ دهید. پرس و جوی SQL شما یک URI برای یک تصویر از یک جدول در BigQuery بازیابی می کند. سپس با استفاده از یک تابع از راه دور BigQuery، URI تصویر را به یک تابع Cloud Run ارسال می کنید که با پاسخ هایی از VQA در مورد تصویر پاسخ می دهد.

تصویرسازی

5832020184ccf2b2.png

از منظر توسعه، این مراحل را در این کد لبه کامل خواهید کرد:

  1. نقطه پایانی HTTP را در توابع Cloud Run ایجاد کنید
  2. یک اتصال از نوع CLOUD_RESOURCE ایجاد کنید
  3. یک جدول شی BigQuery برای سطل Cloud Storage ایجاد کنید
  4. عملکرد راه دور را ایجاد کنید
  5. از تابع راه دور در یک پرس و جو درست مانند سایر توابع تعریف شده توسط کاربر استفاده کنید

چیزی که یاد خواهید گرفت

2. راه اندازی و الزامات

پیش نیازها

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید d1264ca30785e435.png .

cb81e7c8e34bc8d.png

اگر این اولین باری است که Cloud Shell را راه اندازی می کنید، با یک صفحه میانی روبرو می شوید که آن را توصیف می کند. اگر با یک صفحه میانی مواجه شدید، روی Continue کلیک کنید.

d95252b003979716.png

تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.

7833d5e1c5d18f54.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه می‌کند و در Google Cloud اجرا می‌شود، که عملکرد و احراز هویت شبکه را بسیار افزایش می‌دهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.

پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است.

  1. برای تایید احراز هویت، دستور زیر را در 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`
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project

خروجی فرمان

[core]
project = <PROJECT_ID>

اگر اینطور نیست، می توانید آن را با این دستور تنظیم کنید:

gcloud config set project <PROJECT_ID>

خروجی فرمان

Updated property [core/project].

3. تنظیم متغیرهای محیط محلی

در این کد، چند متغیر محیطی برای بهبود خوانایی دستورات gcloud استفاده شده در این codelab ایجاد خواهید کرد.

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، ابتدا باید با استفاده از تابع Cloud Run یک نقطه پایانی HTTP ایجاد کنید. نقطه پایانی باید بتواند دسته ای از ردیف ها را در یک درخواست HTTP POST پردازش کند و نتایج را برای دسته به عنوان پاسخ HTTP برگرداند.

این تابع Cloud Run URI ذخیره سازی تصویر و اعلان سؤال را به عنوان ورودی از پرس و جوی SQL شما دریافت می کند و پاسخ را از Visual Question Answering (VQA) برمی گرداند.

این کد لبه از مثالی برای زمان اجرا python311 با استفاده از Vertex AI SDK برای پایتون استفاده می کند.

کد منبع را برای تابع ایجاد کنید

ابتدا یک دایرکتوری و سی دی در آن دایرکتوری ایجاد کنید.

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

اگر ترجیح می دهید به عنوان نسل دوم توابع ابری مستقر شوید، از دستور زیر استفاده کنید:

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 Bucket را ایجاد کنید

ابتدا یک سطل Cloud Storage برای ذخیره تصاویر خود ایجاد کنید.

gcloud storage buckets create gs://$BUCKET_NAME

بعد، یک تصویر برای VQA آپلود کنید تا از آن استفاده کنید. این کد لبه از تصویر مثالی از مستندات VQA استفاده می کند.

می‌توانید از کنسول Cloud برای ذخیره‌سازی ابری برای آپلود مستقیم تصویر در سطل خود استفاده کنید. یا می توانید دستورات زیر را اجرا کنید تا تصویر مثال را در پوشه Cloud Shell فعلی خود بارگیری کنید

wget -O image.jpg -o /dev/null https://unsplash.com/photos/QqN25A3iF9w/download?ixid=M3wxMjA3fDB8MXxhbGx8fHx8fHx8fHwxNjk1NzYxMjY2fA&force=true

و سپس در سطل Cloud Storage خود آپلود کنید.

gcloud storage cp image.jpg gs://$BUCKET_NAME

6. یک اتصال BigQuery Cloud Resource ایجاد کنید

BigQuery از یک اتصال CLOUD_RESOURCE برای تعامل با عملکرد Cloud شما استفاده می کند. برای ایجاد این اتصال دستور زیر را اجرا کنید.

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"

برای دسترسی به سطل Cloud Storage خود به حساب سرویس اجازه دسترسی بدهید.

gsutil iam ch serviceAccount:$CONNECTION_SA:objectAdmin gs://$BUCKET_NAME

7. یک جدول شی BigQuery ایجاد کنید

جداول شی BigQuery جداول فقط خواندنی روی اشیاء داده بدون ساختار هستند که در Cloud Storage قرار دارند.

جداول Object به شما امکان می دهد داده های بدون ساختار را در 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 Remote را ایجاد کنید

آخرین مرحله این است که اکنون تابع BigQuery Remote را پیکربندی کنید.

ابتدا به حساب سرویس اتصال 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 Query را در یک متغیر ذخیره کنید.

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 Remote را در پرس و جوی SQL فراخوانی کنید

اکنون مراحل توسعه برای ایجاد تابع راه دور را تکمیل کرده اید. اکنون می توانید تابع Cloud Run خود را از داخل یک پرس و جوی SQL فراخوانی کنید.

ابتدا سوال خود و SQL Query را در یک متغیر ذخیره کنید. این کد لبه از مثالی از مستندات Visual Question Answering استفاده می کند. این عبارت از آخرین تصویر اضافه شده به سطل ذخیره سازی شما استفاده می کند.

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 Query را اجرا کنید تا پاسخ سرویس Vertex AI Visual Question Answering (VQA) را نشان دهید.

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 دقیقه منتظر بمانید تا مجوز نقش Invoker Cloud Function به BigQuery منتشر شود. حساب خدمات اتصال قبل از تلاش مجدد

11. تبریک!

برای تکمیل کد لبه تبریک می گویم!

توصیه می‌کنیم اسناد مربوط به عملکردهای راه دور BigQuery و پاسخ‌گویی به سؤالات بصری (VQA) را مرور کنید.

آنچه را پوشش داده ایم

  • نحوه پیکربندی احراز هویت در یک تابع Cloud Run و تأیید اینکه احراز هویت به درستی پیکربندی شده است
  • با ارائه توکن برای هویت gcloud خود، یک تابع احراز هویت شده را از یک محیط توسعه محلی فراخوانی کنید
  • نحوه ایجاد یک حساب سرویس و دادن نقش مناسب برای فراخوانی یک تابع
  • چگونه می توان یک سرویس را از یک محیط توسعه محلی جعل کرد که نقش های مناسب برای فراخوانی یک تابع را دارد

12. پاکسازی کنید

برای جلوگیری از هزینه‌های غیرعمدی، (به عنوان مثال، اگر این تابع Cloud Run به طور ناخواسته بیشتر از تخصیص فراخوانی تابع Cloud Run ماهانه شما در ردیف رایگان فراخوانی شود)، می‌توانید تابع Cloud را حذف کنید یا پروژه‌ای را که در مرحله 2 ایجاد کرده‌اید حذف کنید.

برای حذف تابع Cloud Run، به کنسول Cloud Run Cloud در https://console.cloud.google.com/functions/ بروید و تابع imagen-vqa (یا اگر از نام دیگری استفاده کرده اید $FUNCTION_NAME) را حذف کنید.

اگر تصمیم به حذف کل پروژه دارید، می‌توانید به https://console.cloud.google.com/cloud-resource-manager بروید، پروژه‌ای را که در مرحله ۲ ایجاد کرده‌اید انتخاب کنید و حذف را انتخاب کنید. اگر پروژه را حذف کنید، باید پروژه ها را در Cloud SDK خود تغییر دهید. با اجرای gcloud projects list می توانید لیست تمام پروژه های موجود را مشاهده کنید.