एसक्यूएल क्वेरी में Vertex AI विज़ुअल सवालों के जवाब (VQA) से सवाल पूछने के लिए, BigQuery रिमोट फ़ंक्शन का इस्तेमाल करें

1. परिचय

खास जानकारी

BigQuery के रिमोट फ़ंक्शन की मदद से, एसक्यूएल और JavaScript के अलावा किसी दूसरी भाषा में फ़ंक्शन लागू किया जा सकता है. इसके अलावा, BigQuery के उपयोगकर्ता के तय किए गए फ़ंक्शन में इस्तेमाल न की जा सकने वाली लाइब्रेरी और सेवाओं का इस्तेमाल करके भी फ़ंक्शन लागू किया जा सकता है. BigQuery के रिमोट फ़ंक्शन, Cloud Run फ़ंक्शन और Cloud Run के साथ सीधे तौर पर इंटिग्रेट होते हैं. किसी SQL क्वेरी में BigQuery के रिमोट फ़ंक्शन को कॉल करने के लिए, एक या उससे ज़्यादा कॉलम को इनपुट के तौर पर डालें. इसके बाद, आउटपुट के तौर पर एक वैल्यू दिखाएं.

Cloud Run फ़ंक्शन, डेवलपर के लिए लाइटवेट कंप्यूट सलूशन है. इसकी मदद से डेवलपर, एक ही मकसद के लिए बनाए गए ऐसे फ़ंक्शन बना सकते हैं जिन्हें एचटीटीपीएस का इस्तेमाल करके ट्रिगर किया जा सकता है. इसके अलावा, यह सर्वर या रनटाइम एनवायरमेंट को मैनेज किए बिना, CloudEvents का जवाब दे सकते हैं. Cloud Run फ़ंक्शन, Node.js, Python, Go, Java, .NET, Ruby, और PHP के साथ काम करते हैं.

इस कोडलैब में, आपको BigQuery रिमोट फ़ंक्शन बनाने का तरीका बताया जाएगा. इससे, Vertex AI विज़ुअल क्वेश्चन आंसरिंग (वीक्यूए) का इस्तेमाल करके, Cloud Storage में सेव की गई इमेज के बारे में सवालों के जवाब पाए जा सकते हैं. आपकी SQL क्वेरी, BigQuery की टेबल से किसी इमेज का यूआरआई ले आएगी. इसके बाद, BigQuery के रिमोट फ़ंक्शन का इस्तेमाल करके, इमेज का यूआरआई किसी Cloud Run फ़ंक्शन को भेजा जाएगा. यह फ़ंक्शन, इमेज के बारे में VQA से मिले जवाबों के साथ जवाब देगा.

इलस्ट्रेशन

5832020184ccf2b2.png

डेवलपमेंट के लिहाज़ से, इस कोडलैब में आपको ये चरण पूरे करने होंगे:

  1. Cloud Run फ़ंक्शन में एचटीटीपी एंडपॉइंट बनाना
  2. CLOUD_RESOURCE टाइप का कनेक्शन बनाना
  3. Cloud Storage बकेट के लिए BigQuery ऑब्जेक्ट टेबल बनाना
  4. रिमोट फ़ंक्शन बनाना
  5. किसी क्वेरी में रिमोट फ़ंक्शन का इस्तेमाल, उपयोगकर्ता के तय किए गए अन्य फ़ंक्शन की तरह ही करें

आपको इनके बारे में जानकारी मिलेगी

  • Python में एचटीटीपी Cloud Run फ़ंक्शन बनाने का तरीका
  • किसी एसक्यूएल क्वेरी में BigQuery रिमोट फ़ंक्शन बनाने और उसका इस्तेमाल करने का तरीका
  • BigQuery ऑब्जेक्ट टेबल बनाने का तरीका
  • विज़ुअल क्वेश्चन आंसरिंग (वीक्यूए) का इस्तेमाल करने के लिए, Python के लिए Vertex AI SDK का इस्तेमाल करने का तरीका

2. सेटअप और ज़रूरी शर्तें

ज़रूरी शर्तें

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें d1264ca30785e435.png पर क्लिक करें.

cb81e7c8e34bc8d.png

अगर Cloud Shell पहली बार शुरू किया जा रहा है, तो आपको एक इंटरमीडियरी स्क्रीन दिखेगी. इसमें Cloud Shell के बारे में बताया गया होगा. अगर आपको इंटरमीडियरी स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

d95252b003979716.png

Cloud Shell को प्रोवाइड करने और उससे कनेक्ट करने में सिर्फ़ कुछ मिनट लगेंगे.

7833d5e1c5d18f54.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल लोड होते हैं. इसमें लगातार पांच जीबी की होम डायरेक्ट्री मिलती है और यह Google Cloud में काम करती है. यह नेटवर्क की परफ़ॉर्मेंस और ऑथेंटिकेशन को बेहतर बनाने में मदद करती है. अगर सभी नहीं, तो इस कोडलैब में आपका बहुत सारा काम ब्राउज़र से किया जा सकता है.

Cloud Shell से कनेक्ट करने के बाद, आपको दिखेगा कि आपकी पुष्टि हो चुकी है और प्रोजेक्ट आपके प्रोजेक्ट आईडी पर सेट है.

  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 कमांड को आसानी से पढ़ा जा सके.

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 फ़ंक्शन का इस्तेमाल करके एचटीटीपी एंडपॉइंट बनाना होगा. यह ज़रूरी है कि एंडपॉइंट, एक ही एचटीटीपी पोस्ट अनुरोध में लाइनों के बैच को प्रोसेस कर सके और बैच के नतीजों को एचटीटीपी रिस्पॉन्स के तौर पर दिखा सके.

इस Cloud Run फ़ंक्शन को आपकी एसक्यूएल क्वेरी से, इमेज स्टोरेज यूआरआई और सवाल के प्रॉम्प्ट के तौर पर इनपुट मिलेगा. साथ ही, यह विज़ुअल क्वेश्चन आंसरिंग (वीक्यूए) से जवाब देगा.

इस कोडलैब में, Python के लिए Vertex AI SDK का इस्तेमाल करके, python311 रनटाइम के लिए एक उदाहरण का इस्तेमाल किया गया है.

फ़ंक्शन के लिए सोर्स कोड बनाना

सबसे पहले, एक डायरेक्ट्री बनाएं और उस डायरेक्ट्री में 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 फ़ंक्शन को डिप्लॉय करना

अब python311 रनटाइम के लिए, Cloud Run फ़ंक्शन को डिप्लॉय किया जा सकता है.

Cloud Run फ़ंक्शन को सीधे Cloud Run पर डिप्लॉय करने के लिए, यह कमांड चलाएं:

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

अगर आपको Cloud Functions के दूसरे जनरेशन के तौर पर डिप्लॉय करना है, तो नीचे दिए गए कमांड का इस्तेमाल करें:

gcloud functions deploy $FUNCTION_NAME \
--gen2 \
--region=$FUNCTION_REGION \
--runtime=python311 \
--trigger-http \
--source=. \
--no-allow-unauthenticated

इसके बाद, फ़ंक्शन यूआरएल को एनवायरमेंट वैरिएबल के तौर पर सेव किया जा सकता है, ताकि इसे बाद में इस्तेमाल किया जा सके.

ENDPOINT_URL="$(gcloud beta run services describe $FUNCTION_NAME --region $FUNCTION_REGION --format='value(status.url)')"

5. Cloud Storage बकेट बनाना

सबसे पहले, अपनी इमेज सेव करने के लिए Cloud Storage बकेट बनाएं.

gcloud storage buckets create gs://$BUCKET_NAME

इसके बाद, वीक्य्यूए के इस्तेमाल के लिए कोई इमेज अपलोड करें. इस कोडलैब में, वीक्यूए दस्तावेज़ की उदाहरण इमेज का इस्तेमाल किया गया है.

सीधे अपनी बकेट में इमेज अपलोड करने के लिए, Cloud Storage के लिए Cloud Console का इस्तेमाल किया जा सकता है. इसके अलावा, अपनी मौजूदा 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 रिसॉर्स कनेक्शन बनाना

BigQuery, आपके Cloud फ़ंक्शन के साथ इंटरैक्ट करने के लिए, 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"

अपनी Cloud Storage बकेट को ऐक्सेस करने के लिए, सेवा खाते को ऐक्सेस दें.

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

7. BigQuery ऑब्जेक्ट टेबल बनाना

BigQuery ऑब्जेक्ट टेबल, Cloud Storage में मौजूद बिना स्ट्रक्चर वाले डेटा ऑब्जेक्ट के ऊपर मौजूद रीड-ओनली टेबल होती हैं.

ऑब्जेक्ट टेबल की मदद से, Cloud Storage में मौजूद अनस्ट्रक्चर्ड डेटा का विश्लेषण किया जा सकता है. रीमोट फ़ंक्शन की मदद से विश्लेषण किया जा सकता है. इसके बाद, इन ऑपरेशन के नतीजों को BigQuery में मौजूद अपने बाकी स्ट्रक्चर्ड डेटा के साथ जोड़ा जा सकता है.

सबसे पहले, डेटासेट बनाएं.

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

यह निर्देश आपके Cloud Storage इमेज बकेट के आधार पर ऑब्जेक्ट टेबल बनाता है. इससे बनी टेबल में, उस बकेट में मौजूद सभी इमेज के यूआरआई शामिल होंगे.

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 रिमोट फ़ंक्शन को कॉन्फ़िगर करना है.

सबसे पहले, Cloud Run फ़ंक्शन को चालू करने के लिए, BigQuery कनेक्शन के सेवा खाते को अनुमतियां दें. हमारा सुझाव है कि आप अपनी Cloud Run फ़ंक्शन सेवा के लिए, पुष्टि किए बिना अनुरोध करने की अनुमति न दें.

gcloud run services add-iam-policy-binding $FUNCTION_NAME \
 --member=serviceAccount:$CONNECTION_SA \
 --role="roles/run.invoker" \
 --region $FUNCTION_REGION

इसके बाद, एसक्यूएल क्वेरी को एक वैरिएबल में सेव करें.

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 क्वेरी को किसी वैरिएबल में सेव करें. इस कोडलैब में, विज़ुअल सवालों के जवाब देने वाले मॉडल के दस्तावेज़ में दिए गए उदाहरण का इस्तेमाल किया गया है. यह क्वेरी, आपके स्टोरेज बकेट में जोड़ी गई नई इमेज का इस्तेमाल करती है.

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 की विज़ुअल क्वेश्चन आंसरिंग (वीक्यूए) सेवा से मिला जवाब दिखाने के लिए, एसक्यूएल क्वेरी चलाएं.

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 कनेक्शन सेवा खाते में Cloud Function Invoker की भूमिका की अनुमति लागू हो सके.

11. बधाई हो!

कोडलैब पूरा करने के लिए बधाई!

हमारा सुझाव है कि आप BigQuery रिमोट फ़ंक्शन और विज़ुअल तौर पर सवालों के जवाब देने वाली सुविधा (VQA) से जुड़े दस्तावेज़ देखें.

इसमें हमने इन विषयों के बारे में बताया

  • Cloud Run फ़ंक्शन पर पुष्टि करने की सुविधा को कॉन्फ़िगर करने और पुष्टि करने की सुविधा को सही तरीके से कॉन्फ़िगर किया गया है, इसकी पुष्टि करने का तरीका
  • अपनी gcloud पहचान के लिए टोकन देकर, स्थानीय डेवलपमेंट एनवायरमेंट से पुष्टि किए गए फ़ंक्शन को शुरू करना
  • सेवा खाता बनाने और उसे फ़ंक्शन शुरू करने के लिए सही भूमिका देने का तरीका
  • किसी स्थानीय डेवलपमेंट एनवायरमेंट में मौजूद किसी ऐसी सेवा के तौर पर काम करने का तरीका जिसके पास फ़ंक्शन को ट्रिगर करने के लिए ज़रूरी भूमिकाएं हों

12. व्यवस्थित करें

अनजाने में होने वाले शुल्कों से बचने के लिए, Cloud Function को मिटाएं या दूसरे चरण में बनाया गया प्रोजेक्ट मिटाएं. उदाहरण के लिए, अगर इस Cloud Run फ़ंक्शन को अनजाने में फ़्री टीयर में, हर महीने Cloud Run फ़ंक्शन को इस्तेमाल करने के लिए तय किए गए कोटे से ज़्यादा बार इस्तेमाल किया जाता है, तो ऐसा हो सकता है कि आपसे शुल्क लिया जाए.

Cloud Run फ़ंक्शन को मिटाने के लिए, https://console.cloud.google.com/functions/ पर Cloud Run Cloud Console पर जाएं. इसके बाद, imagen-vqa फ़ंक्शन को मिटाएं (या अगर आपने किसी दूसरे नाम का इस्तेमाल किया है, तो $Function_NAME).

अगर आपको पूरा प्रोजेक्ट मिटाना है, तो https://console.cloud.google.com/cloud-resource-manager पर जाएं. इसके बाद, दूसरे चरण में बनाया गया प्रोजेक्ट चुनें और 'मिटाएं' को चुनें. प्रोजेक्ट मिटाने पर, आपको अपने Cloud SDK में प्रोजेक्ट बदलने होंगे. gcloud projects list चलाकर, सभी उपलब्ध प्रोजेक्ट की सूची देखी जा सकती है.