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

1. ভূমিকা

ওভারভিউ

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

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

এই কোডল্যাবে, আপনি Vertex AI Visual Question Answering (VQA) ব্যবহার করে ক্লাউড স্টোরেজে সংরক্ষিত ছবি সম্পর্কে একটি প্রশ্নের উত্তর পেতে কীভাবে একটি BigQuery রিমোট ফাংশন তৈরি করবেন তা শিখবেন। আপনার SQL কোয়েরি BigQuery-এর একটি টেবিল থেকে একটি ছবির জন্য একটি URI পুনরুদ্ধার করবে। তারপর একটি BigQuery রিমোট ফাংশন ব্যবহার করে, আপনি একটি ক্লাউড রান ফাংশনে ইমেজ URI পাঠাবেন যেটি ইমেজ সম্পর্কে VQA থেকে উত্তরের সাথে উত্তর দেবে।

ইলাস্ট্রেশন

5832020184ccf2b2.png

বিকাশের দৃষ্টিকোণ থেকে, এই কোডল্যাবে আপনি এই পদক্ষেপগুলি সম্পূর্ণ করবেন:

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

আপনি কি শিখবেন

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

পূর্বশর্ত

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

  1. ক্লাউড কনসোল থেকে, ক্লাউড শেল সক্রিয় করুন ক্লিক করুন d1264ca30785e435.png .

cb81e7c8e34bc8d.png

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

d95252b003979716.png

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

7833d5e1c5d18f54.png

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

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

  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].

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. ক্লাউড রান ফাংশন তৈরি করুন

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

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

এই কোডল্যাবটি পাইথনের জন্য Vertex AI SDK ব্যবহার করে python311 রানটাইমের একটি উদাহরণ ব্যবহার করে।

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

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

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

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

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

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

gcloud beta run deploy $FUNCTION_NAME \
      --source . \
      --function imagen_vqa \
      --region $FUNCTION_REGION \
      --no-allow-unauthenticated

আপনি যদি ক্লাউড ফাংশন 2nd জেনার হিসাবে স্থাপন করতে পছন্দ করেন তবে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

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. ক্লাউড স্টোরেজ বালতি তৈরি করুন

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

gcloud storage buckets create gs://$BUCKET_NAME

এরপর, 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

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 অবজেক্ট টেবিলগুলি ক্লাউড স্টোরেজে থাকা অসংগঠিত ডেটা অবজেক্টের উপর শুধুমাত্র পঠনযোগ্য টেবিল।

অবজেক্ট টেবিল আপনাকে ক্লাউড স্টোরেজে অসংগঠিত ডেটা বিশ্লেষণ করতে দেয়। আপনি দূরবর্তী ফাংশনগুলির সাথে বিশ্লেষণ করতে পারেন এবং তারপর 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

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

9. একটি 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 ভিজ্যুয়াল প্রশ্ন উত্তর (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 |
+---------------------------------+--------------------------------+----------+

10. সমস্যা সমাধান

BigQuery টেবিল তৈরি করার সময়, আপনি যদি BigQuery error in mk operation: Source URI must be a Google Cloud Storage location: gs://$BUCKET_NAME কমান্ডে $BUCKET_NAME পরে আপনি /* পাথ অন্তর্ভুক্ত করেছেন তা নিশ্চিত করুন।

আপনার এসকিউএল ক্যোয়ারী চালানোর সময়, যদি আপনি একটি ত্রুটি পান Access Denied: BigQuery BigQuery: Received response code 403 from endpoint <your-function-endpoint> , BigQuery-এ প্রচার করার জন্য ক্লাউড ফাংশন ইনভোকার ভূমিকা অনুমতি অনুদানের জন্য প্রায় 1-2 মিনিট অপেক্ষা করার চেষ্টা করুন পুনরায় চেষ্টা করার আগে সংযোগ পরিষেবা অ্যাকাউন্ট।

11. অভিনন্দন!

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

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

আমরা কভার করেছি কি

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

12. পরিষ্কার করুন

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

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

আপনি যদি সম্পূর্ণ প্রকল্প মুছে ফেলার সিদ্ধান্ত নেন, আপনি https://console.cloud.google.com/cloud-resource-manager- এ যেতে পারেন, ধাপ 2-এ আপনার তৈরি করা প্রকল্পটি নির্বাচন করুন এবং মুছুন নির্বাচন করুন৷ আপনি যদি প্রকল্পটি মুছে ফেলেন, তাহলে আপনাকে আপনার ক্লাউড SDK-এ প্রকল্পগুলি পরিবর্তন করতে হবে৷ আপনি gcloud projects list চালিয়ে সমস্ত উপলব্ধ প্রকল্পের তালিকা দেখতে পারেন।