একটি SQL ক্যোয়ারীতে Vertex AI ভিজ্যুয়াল প্রশ্ন উত্তর (VQA) কে প্রশ্ন জিজ্ঞাসা করতে BigQuery রিমোট ফাংশন ব্যবহার করুন

১. ভূমিকা

সংক্ষিপ্ত বিবরণ

BigQuery রিমোট ফাংশন আপনাকে SQL এবং জাভাস্ক্রিপ্ট ছাড়া অন্য ভাষায় অথবা BigQuery ইউজার-ডিফাইন্ড ফাংশনে অনুমোদিত নয় এমন লাইব্রেরি এবং পরিষেবা ব্যবহার করে একটি ফাংশন প্রয়োগ করার সুযোগ দেয়। BigQuery রিমোট ফাংশন ক্লাউড রান ফাংশন এবং ক্লাউড রানের সাথে সরাসরি ইন্টিগ্রেশন প্রদান করে। আপনি এক বা একাধিক কলামকে ইনপুট হিসাবে নিয়ে এবং আউটপুট হিসাবে একটি একক মান ফেরত দিয়ে একটি SQL কোয়েরির মধ্যে একটি BigQuery রিমোট ফাংশন কল করতে পারেন।

ক্লাউড রান ফাংশনস হলো ডেভেলপারদের জন্য একটি হালকা কম্পিউট সলিউশন, যার মাধ্যমে তারা সার্ভার বা রানটাইম এনভায়রনমেন্ট পরিচালনার প্রয়োজন ছাড়াই একক-উদ্দেশ্যমূলক ও স্বতন্ত্র ফাংশন তৈরি করতে পারেন, যা HTTPS ব্যবহার করে ট্রিগার করা যায় অথবা ক্লাউডইভেন্ট -এ সাড়া দিতে পারে। ক্লাউড রান ফাংশনস Node.js, Python, Go, Java, .NET, Ruby, এবং PHP সাপোর্ট করে।

এই কোডল্যাবে, আপনি শিখবেন কীভাবে ভার্টেক্স এআই ভিজ্যুয়াল কোয়েশ্চেন অ্যানসারিং (VQA) ব্যবহার করে ক্লাউড স্টোরেজে সংরক্ষিত ছবি সম্পর্কিত প্রশ্নের উত্তর পাওয়ার জন্য একটি বিগকোয়েরি রিমোট ফাংশন তৈরি করতে হয়। আপনার SQL কোয়েরিটি বিগকোয়েরির একটি টেবিল থেকে একটি ছবির URI সংগ্রহ করবে। এরপর, একটি বিগকোয়েরি রিমোট ফাংশন ব্যবহার করে, আপনি ছবির URI-টি একটি ক্লাউড রান ফাংশনে পাঠাবেন, যা ছবিটির বিষয়ে VQA থেকে প্রাপ্ত উত্তরগুলো ফেরত পাঠাবে।

চিত্র

5832020184ccf2b2.png

উন্নয়নের দৃষ্টিকোণ থেকে, এই কোডল্যাবে আপনাকে নিম্নলিখিত ধাপগুলো সম্পন্ন করতে হবে:

  1. ক্লাউড রান ফাংশনে HTTP এন্ডপয়েন্ট তৈরি করুন
  2. CLOUD_RESOURCE টাইপের একটি সংযোগ তৈরি করুন
  3. ক্লাউড স্টোরেজ বাকেটের জন্য একটি BigQuery অবজেক্ট টেবিল তৈরি করুন
  4. রিমোট ফাংশন তৈরি করুন
  5. অন্যান্য ইউজার-ডিফাইন্ড ফাংশনের মতোই কোয়েরিতে রিমোট ফাংশন ব্যবহার করুন।

আপনি যা শিখবেন

২. সেটআপ এবং প্রয়োজনীয়তা

পূর্বশর্ত

ক্লাউড শেল সক্রিয় করুন

  1. ক্লাউড কনসোল থেকে, অ্যাক্টিভেট ক্লাউড শেল-এ ক্লিক করুন। d1264ca30785e435.png .

cb81e7c8e34bc8d.png

আপনি যদি প্রথমবারের মতো ক্লাউড শেল চালু করেন, তাহলে এটি কী তা বর্ণনা করে একটি মধ্যবর্তী স্ক্রিন আপনার সামনে আসবে। যদি একটি মধ্যবর্তী স্ক্রিন আসে, তাহলে 'চালিয়ে যান' (Continue) এ ক্লিক করুন।

d95252b003979716.png

ক্লাউড শেল প্রস্তুত করতে এবং এর সাথে সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত।

7833d5e1c5d18f54.png

এই ভার্চুয়াল মেশিনটিতে প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার প্রায় সমস্ত কাজই একটি ব্রাউজার দিয়ে করা সম্ভব।

ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি দেখতে পাবেন যে আপনাকে প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে।

  1. আপনি প্রমাণীকৃত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud auth list

কমান্ড আউটপুট

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud কমান্ডটি আপনার প্রজেক্ট সম্পর্কে জানে কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud config list project

কমান্ড আউটপুট

[core]
project = <PROJECT_ID>

যদি তা না থাকে, তবে আপনি এই কমান্ডটি দিয়ে এটি সেট করতে পারেন:

gcloud config set project <PROJECT_ID>

কমান্ড আউটপুট

Updated property [core/project].

৩. স্থানীয় পরিবেশ ভেরিয়েবল সেট আপ করুন

এই কোডল্যাবে ব্যবহৃত 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"

৪. ক্লাউড রান ফাংশনটি তৈরি করুন

একটি BigQuery রিমোট ফাংশন তৈরি করতে, আপনাকে প্রথমে Cloud Run ফাংশন ব্যবহার করে একটি HTTP এন্ডপয়েন্ট তৈরি করতে হবে। এন্ডপয়েন্টটিকে অবশ্যই একটি একক HTTP POST অনুরোধে একগুচ্ছ সারি প্রসেস করতে এবং সেই ব্যাচের ফলাফল একটি HTTP প্রতিক্রিয়া হিসাবে ফেরত দিতে সক্ষম হতে হবে।

এই ক্লাউড রান ফাংশনটি আপনার SQL কোয়েরি থেকে ইনপুট হিসেবে ইমেজ স্টোরেজ URI এবং প্রশ্ন গ্রহণ করবে এবং ভিজ্যুয়াল কোয়েশ্চন অ্যানসারিং (VQA) থেকে উত্তরটি ফেরত দেবে।

এই কোডল্যাবটিতে পাইথনের জন্য ভার্টেক্স এআই এসডিকে (Vertex AI SDK for Python ) ব্যবহার করে পাইথন৩১১ রানটাইমের একটি উদাহরণ দেওয়া হয়েছে।

ফাংশনটির জন্য সোর্স কোড তৈরি করুন।

প্রথমে, একটি ডিরেক্টরি তৈরি করুন এবং সেই ডিরেক্টরিতে প্রবেশ করুন।

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

ক্লাউড রান ফাংশনটি স্থাপন করুন

এখন আপনি পাইথন৩১১ রানটাইমের জন্য আপনার ক্লাউড রান ফাংশনটি ডিপ্লয় করতে পারবেন।

সরাসরি ক্লাউড রান-এ একটি ক্লাউড রান ফাংশন ডেপ্লয় করতে, নিম্নলিখিত কমান্ডটি চালান:

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

৫. ক্লাউড স্টোরেজ বাকেট তৈরি করুন

প্রথমে, আপনার ছবিগুলো সংরক্ষণ করার জন্য একটি ক্লাউড স্টোরেজ বাকেট তৈরি করুন।

gcloud storage buckets create gs://$BUCKET_NAME

এরপর, VQA-এর ব্যবহারের জন্য একটি ছবি আপলোড করুন। এই কোডল্যাবটিতে VQA ডকুমেন্টেশন থেকে উদাহরণ ছবিটি ব্যবহার করা হয়েছে।

আপনি ক্লাউড স্টোরেজের জন্য ক্লাউড কনসোল ব্যবহার করে সরাসরি আপনার বাকেটে ছবিটি আপলোড করতে পারেন। অথবা, আপনি নিম্নলিখিত কমান্ডগুলি চালিয়ে উদাহরণ ছবিটি আপনার বর্তমান ক্লাউড শেল ডিরেক্টরিতে ডাউনলোড করতে পারেন।

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

৬. একটি 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

৭. একটি BigQuery অবজেক্ট টেবিল তৈরি করুন

BigQuery অবজেক্ট টেবিল হলো ক্লাউড স্টোরেজে থাকা অসংগঠিত ডেটা অবজেক্টের ওপর অবস্থিত পঠনযোগ্য (read-only) টেবিল।

অবজেক্ট টেবিল আপনাকে ক্লাউড স্টোরেজে থাকা অসংগঠিত ডেটা বিশ্লেষণ করতে দেয়। আপনি রিমোট ফাংশন ব্যবহার করে বিশ্লেষণ সম্পাদন করতে পারেন এবং তারপরে এই অপারেশনগুলির ফলাফল BigQuery-তে আপনার বাকি সংগঠিত ডেটার সাথে যুক্ত করতে পারেন।

প্রথমে একটি ডেটাসেট তৈরি করুন।

bq --location=$BQ_REGION mk \
    --dataset \
    $DATASET_ID

নিম্নলিখিত কমান্ডটি আপনার ক্লাউড স্টোরেজ ইমেজ বাকেটের উপর ভিত্তি করে একটি অবজেক্ট টেবিল তৈরি করে। ফলস্বরূপ টেবিলটিতে সেই বাকেটের সমস্ত ইমেজের URI থাকবে।

bq mk --table \
--external_table_definition=gs://$BUCKET_NAME/*@$BQ_REGION.$CONNECTION_ID \
--object_metadata=SIMPLE \
$PROJECT_ID:$DATASET_ID.$TABLE_NAME

৮. BigQuery রিমোট ফাংশন তৈরি করুন

শেষ ধাপটি হলো এখন BigQuery রিমোট ফাংশনটি কনফিগার করা।

প্রথমে, ক্লাউড রান ফাংশনটি চালু করার জন্য BigQuery কানেকশন সার্ভিস অ্যাকাউন্টকে অনুমতি দিন। আপনার ক্লাউড রান ফাংশন সার্ভিসের জন্য প্রমাণীকরণবিহীন চালু করার অনুমতি দেওয়া বাঞ্ছনীয় নয়।

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 দেখতে পাবেন।

৯. একটি SQL কোয়েরিতে BigQuery রিমোট ফাংশন কল করুন।

আপনি এখন রিমোট ফাংশন তৈরির উন্নয়ন ধাপগুলো সম্পন্ন করেছেন। এখন আপনি একটি 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;
"

এরপর Vertex AI Visual Question Answering (VQA) পরিষেবা থেকে প্রাপ্ত প্রতিক্রিয়াটি দেখানোর জন্য SQL কোয়েরিটি চালান।

bq query --nouse_legacy_sql $SQL_QUERY

ফলাফলগুলো নীচের উদাহরণ আউটপুটের মতো দেখতে হওয়া উচিত:

+---------------------------------+--------------------------------+----------+
|               uri               |    image_prompt                |  result  |
+---------------------------------+--------------------------------+----------+
| gs://<YOUR_BUCKET>/image.jpg    | What objects are in the image? |  marbles |
+---------------------------------+--------------------------------+----------+

১০. সমস্যা সমাধান

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> আসে, তাহলে পুনরায় চেষ্টা করার আগে Cloud Function Invoker রোলের পারমিশনটি BigQuery কানেকশন সার্ভিস অ্যাকাউন্টে স্থানান্তরিত হওয়ার জন্য প্রায় ১-২ মিনিট অপেক্ষা করুন।

১১. অভিনন্দন!

কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন!

আমরা BigQuery Remote Functions এবং Visual Question Answering (VQA) সম্পর্কিত ডকুমেন্টেশন পর্যালোচনা করার পরামর্শ দিই।

আমরা যা আলোচনা করেছি

  • ক্লাউড রান ফাংশনে কীভাবে অথেন্টিকেশন কনফিগার করবেন এবং অথেন্টিকেশন সঠিকভাবে কনফিগার করা হয়েছে কিনা তা যাচাই করবেন।
  • আপনার gcloud আইডেন্টিটির টোকেন প্রদান করে স্থানীয় ডেভেলপমেন্ট এনভায়রনমেন্ট থেকে একটি অথেনটিকেটেড ফাংশন কল করুন।
  • কীভাবে একটি সার্ভিস অ্যাকাউন্ট তৈরি করবেন এবং একটি ফাংশন চালু করার জন্য এটিকে উপযুক্ত ভূমিকা প্রদান করবেন
  • স্থানীয় উন্নয়ন পরিবেশ থেকে এমন একটি পরিষেবার ছদ্মবেশ ধারণ করার উপায়, যেটির কোনো ফাংশন আহ্বান করার জন্য উপযুক্ত ভূমিকা রয়েছে।

১২. পরিষ্কার করুন

অনিচ্ছাকৃত চার্জ এড়াতে, (উদাহরণস্বরূপ, যদি এই ক্লাউড রান ফাংশনটি ফ্রি টিয়ারে আপনার মাসিক ক্লাউড রান ফাংশন আহ্বানের বরাদ্দের চেয়ে অনিচ্ছাকৃতভাবে বেশিবার চালু হয়), আপনি হয় ক্লাউড ফাংশনটি অথবা ধাপ ২-এ তৈরি করা প্রজেক্টটি ডিলিট করে দিতে পারেন।

ক্লাউড রান ফাংশনটি ডিলিট করতে, https://console.cloud.google.com/functions/ -এ অবস্থিত ক্লাউড রান ক্লাউড কনসোলে যান এবং imagen-vqa ফাংশনটি ডিলিট করুন (অথবা আপনি যদি অন্য কোনো নাম ব্যবহার করে থাকেন, তবে $FUNCTION_NAME ডিলিট করুন)।

আপনি যদি পুরো প্রজেক্টটি মুছে ফেলতে চান, তাহলে আপনি https://console.cloud.google.com/cloud-resource-manager -এ গিয়ে, ধাপ ২-এ তৈরি করা প্রজেক্টটি নির্বাচন করে 'ডিলিট' (Delete) বিকল্পটি বেছে নিতে পারেন। প্রজেক্টটি মুছে ফেললে, আপনাকে আপনার ক্লাউড এসডিকে (Cloud SDK)-তে প্রজেক্ট পরিবর্তন করতে হবে। আপনি gcloud projects list চালিয়ে সমস্ত উপলব্ধ প্রজেক্টের তালিকা দেখতে পারেন।