1. परिचय
खास जानकारी
BigQuery के रिमोट फ़ंक्शन की मदद से, एसक्यूएल और JavaScript के अलावा अन्य भाषाओं में फ़ंक्शन लागू किया जा सकता है. इसके अलावा, उन लाइब्रेरी और सेवाओं का इस्तेमाल किया जा सकता है जिनकी अनुमति BigQuery के उपयोगकर्ता के तय किए गए फ़ंक्शन में नहीं है. BigQuery रिमोट फ़ंक्शन, Cloud Run फ़ंक्शन और Cloud Run के साथ सीधे तौर पर इंटिग्रेट होते हैं. एसक्यूएल क्वेरी में BigQuery के रिमोट फ़ंक्शन को कॉल किया जा सकता है. इसके लिए, एक या उससे ज़्यादा कॉलम को इनपुट के तौर पर लिया जाता है. इसके बाद, आउटपुट के तौर पर एक वैल्यू मिलती है.
Cloud Run फ़ंक्शन, डेवलपर के लिए एक आसान कंप्यूट सॉल्यूशन है. इसकी मदद से, एक ही मकसद के लिए स्टैंड-अलोन फ़ंक्शन बनाए जा सकते हैं. इन्हें एचटीटीपीएस का इस्तेमाल करके ट्रिगर किया जा सकता है या ये CloudEvents का जवाब दे सकते हैं. इसके लिए, सर्वर या रनटाइम एनवायरमेंट को मैनेज करने की ज़रूरत नहीं होती. Cloud Run फ़ंक्शन, Node.js, Python, Go, Java, .NET, Ruby, और PHP के साथ काम करते हैं.
इस कोडलैब में, आपको BigQuery रिमोट फ़ंक्शन बनाने का तरीका बताया जाएगा. इसकी मदद से, Cloud Storage में सेव की गई इमेज के बारे में पूछे गए सवाल का जवाब पाया जा सकता है. इसके लिए, Vertex AI विज़ुअल क्वेश्चन आंसरिंग (वीक्यूए) का इस्तेमाल किया जाता है. आपकी एसक्यूएल क्वेरी, BigQuery की टेबल से किसी इमेज के लिए यूआरआई वापस लाएगी. इसके बाद, BigQuery रिमोट फ़ंक्शन का इस्तेमाल करके, इमेज का यूआरआई, Cloud Run फ़ंक्शन को भेजा जाएगा. यह फ़ंक्शन, इमेज के बारे में VQA से मिले जवाबों के साथ वापस जवाब देगा.
इलस्ट्रेशन

डेवलपमेंट के नज़रिए से, इस कोडलैब में आपको ये चरण पूरे करने होंगे:
- Cloud Run फ़ंक्शन में एचटीटीपी एंडपॉइंट बनाना
- CLOUD_RESOURCE टाइप का कनेक्शन बनाना
- Cloud Storage बकेट के लिए BigQuery ऑब्जेक्ट टेबल बनाना
- रिमोट फ़ंक्शन बनाना
- क्वेरी में रिमोट फ़ंक्शन का इस्तेमाल, उपयोगकर्ता के तय किए गए किसी अन्य फ़ंक्शन की तरह ही करें
आपको क्या सीखने को मिलेगा
- Python में एचटीटीपी Cloud Run फ़ंक्शन बनाने का तरीका
- एसक्यूएल क्वेरी में BigQuery रिमोट फ़ंक्शन बनाने और इस्तेमाल करने का तरीका
- BigQuery ऑब्जेक्ट टेबल बनाने का तरीका
- विज़ुअल क्वेश्चन आंसरिंग (वीक्यूए) का इस्तेमाल करने के लिए, Vertex AI SDK for Python का इस्तेमाल कैसे करें
2. सेटअप और ज़रूरी शर्तें
ज़रूरी शर्तें
- आपने Cloud Console में लॉग इन किया हो.
- आपने पहले कोई एचटीटीपी Cloud Run फ़ंक्शन डिप्लॉय किया हो. Python के लिए क्विकस्टार्ट देखें.
- आपने Cloud Storage में पहले से ही कोई बकेट बनाई हो. Cloud Storage की क्विकस्टार्ट गाइड देखें.
- आपके पास BigQuery में डेटासेट, टेबल, और रिमोट फ़ंक्शन बनाने के लिए ज़रूरी भूमिकाएं हों. BigQuery में डेटा लोड करने और क्वेरी करने के बारे में क्विकस्टार्ट गाइड देखें.
Cloud Shell चालू करें
- Cloud Console में, Cloud Shell चालू करें
पर क्लिक करें.

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

Cloud Shell से कनेक्ट होने में कुछ ही सेकंड लगेंगे.

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है, जो हमेशा बनी रहती है. साथ ही, यह Google Cloud में काम करता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस कोडलैब में ज़्यादातर काम ब्राउज़र से किया जा सकता है.
Cloud Shell से कनेक्ट होने के बाद, आपको दिखेगा कि आपकी पुष्टि हो गई है और प्रोजेक्ट को आपके प्रोजेक्ट आईडी पर सेट कर दिया गया है.
- पुष्टि करें कि आपने 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`
- यह पुष्टि करने के लिए कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है, Cloud Shell में यह कमांड चलाएं:
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 फ़ंक्शन, आपकी SQL क्वेरी से इमेज स्टोरेज यूआरआई और सवाल के प्रॉम्प्ट को इनपुट के तौर पर लेगा. साथ ही, विज़ुअल क्वेश्चन आंसरिंग (वीक्यूए) से जवाब देगा.
इस कोडलैब में, 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 2nd gen के तौर पर डिप्लॉय करना है, तो इस कमांड का इस्तेमाल करें:
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
इसके बाद, वीक्यूए के लिए कोई इमेज अपलोड करें. इस कोडलैब में, VQA के दस्तावेज़ में मौजूद उदाहरण इमेज का इस्तेमाल किया गया है.
इमेज को सीधे अपनी बकेट में अपलोड करने के लिए, 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 Resource कनेक्शन बनाना
BigQuery, आपके Cloud Function के साथ इंटरैक्ट करने के लिए 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 रिमोट फ़ंक्शन को कॉन्फ़िगर करना होता है.
सबसे पहले, 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_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 रिमोट फ़ंक्शन को कॉल करना
आपने रिमोट फ़ंक्शन बनाने के लिए, डेवलपमेंट के सभी चरण पूरे कर लिए हैं. अब एसक्यूएल क्वेरी में Cloud Run फ़ंक्शन को कॉल किया जा सकता है.
सबसे पहले, अपने सवाल और एसक्यूएल क्वेरी को किसी वैरिएबल में सेव करें. यह कोडलैब, विज़ुअल क्वेश्चन आंसरिंग के दस्तावेज़ में दिए गए उदाहरण का इस्तेमाल करता है. इस क्वेरी में, आपके स्टोरेज बकेट में जोड़ी गई सबसे नई इमेज का इस्तेमाल किया जाता है.
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) सेवा से जवाब पाने के लिए, एसक्यूएल क्वेरी चलाएँ.
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> मिलती है, तो फिर से कोशिश करने से पहले, Cloud Function Invoker की भूमिका की अनुमति को BigQuery कनेक्शन सेवा खाते में लागू होने के लिए, करीब एक से दो मिनट इंतज़ार करें.
11. बधाई हो!
कोडलैब पूरा करने के लिए बधाई!
हमारा सुझाव है कि आप BigQuery रिमोट फ़ंक्शन और विज़ुअल क्वेश्चन आंसरिंग (वीक्यूए) के बारे में दस्तावेज़ पढ़ें.
हमने क्या-क्या बताया
- Cloud Run फ़ंक्शन पर पुष्टि करने की सुविधा को कॉन्फ़िगर करने का तरीका और यह पुष्टि करना कि पुष्टि करने की सुविधा को सही तरीके से कॉन्फ़िगर किया गया है
- gcloud आइडेंटिटी के लिए टोकन देकर, लोकल डेवलपमेंट एनवायरमेंट से पुष्टि किया गया फ़ंक्शन शुरू करना
- सेवा खाता बनाने और किसी फ़ंक्शन को शुरू करने के लिए, उसे सही भूमिका असाइन करने का तरीका
- लोकल डेवलपमेंट एनवायरमेंट से किसी सेवा के तौर पर काम करने का तरीका. इस एनवायरमेंट में, फ़ंक्शन को चालू करने के लिए ज़रूरी भूमिकाएं मौजूद हों
12. व्यवस्थित करें
अनजाने में लगने वाले शुल्क से बचने के लिए, (उदाहरण के लिए, अगर इस Cloud Run फ़ंक्शन को फ़्री टियर में Cloud Run फ़ंक्शन को हर महीने इस्तेमाल करने की तय सीमा से ज़्यादा बार इस्तेमाल किया जाता है), तो Cloud फ़ंक्शन को मिटा दें या चरण 2 में बनाए गए प्रोजेक्ट को मिटा दें.
Cloud Run फ़ंक्शन को मिटाने के लिए, Cloud Run Cloud Console पर जाएं. इसका यूआरएल https://console.cloud.google.com/functions/ है. इसके बाद, imagen-vqa फ़ंक्शन (अगर आपने किसी दूसरे नाम का इस्तेमाल किया है, तो $FUNCTION_NAME) को मिटाएं.
अगर आपको पूरा प्रोजेक्ट मिटाना है, तो https://console.cloud.google.com/cloud-resource-manager पर जाएं. इसके बाद, दूसरे चरण में बनाया गया प्रोजेक्ट चुनें और मिटाएं को चुनें. प्रोजेक्ट मिटाने पर, आपको Cloud SDK में प्रोजेक्ट बदलने होंगे. gcloud projects list कमांड चलाकर, सभी उपलब्ध प्रोजेक्ट की सूची देखी जा सकती है.