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 در مورد تصویر پاسخ می دهد.
تصویرسازی
از منظر توسعه، این مراحل را در این کد لبه کامل خواهید کرد:
- نقطه پایانی HTTP را در توابع Cloud Run ایجاد کنید
- یک اتصال از نوع CLOUD_RESOURCE ایجاد کنید
- یک جدول شی BigQuery برای سطل Cloud Storage ایجاد کنید
- عملکرد راه دور را ایجاد کنید
- از تابع راه دور در یک پرس و جو درست مانند سایر توابع تعریف شده توسط کاربر استفاده کنید
چیزی که یاد خواهید گرفت
- نحوه ایجاد تابع HTTP Cloud Run در پایتون
- نحوه ایجاد و استفاده از یک تابع از راه دور BigQuery در یک کوئری SQL
- نحوه ایجاد جدول شی BigQuery
- نحوه استفاده از Vertex AI SDK برای پایتون برای استفاده از پاسخگویی به سوالات بصری (VQA)
2. راه اندازی و الزامات
پیش نیازها
- شما به کنسول Cloud وارد شده اید.
- شما قبلاً یک تابع HTTP Cloud Run را مستقر کرده اید. شروع سریع پایتون را ببینید .
- شما قبلاً یک سطل در فضای ذخیرهسازی ابری ایجاد کردهاید. به شروع سریع فضای ذخیره سازی ابری مراجعه کنید .
- شما نقش های مناسبی برای ایجاد مجموعه داده، جدول و تابع راه دور در BigQuery دارید. به Load and Query Data در BigQuery Quickstart مراجعه کنید .
Cloud Shell را فعال کنید
- از Cloud Console، روی Activate Cloud Shell کلیک کنید .
اگر این اولین باری است که Cloud Shell را راه اندازی می کنید، با یک صفحه میانی روبرو می شوید که آن را توصیف می کند. اگر با یک صفحه میانی مواجه شدید، روی Continue کلیک کنید.
تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.
این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه میکند و در Google Cloud اجرا میشود، که عملکرد و احراز هویت شبکه را بسیار افزایش میدهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.
پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است.
- برای تایید احراز هویت، دستور زیر را در 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
استفاده شده در این 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
می توانید لیست تمام پروژه های موجود را مشاهده کنید.