1. परिचय
खास जानकारी
BigQuery के रिमोट फ़ंक्शन की मदद से, एसक्यूएल और JavaScript के अलावा किसी दूसरी भाषा में फ़ंक्शन लागू किया जा सकता है. इसके अलावा, BigQuery के उपयोगकर्ता के तय किए गए फ़ंक्शन में इस्तेमाल न की जा सकने वाली लाइब्रेरी और सेवाओं का इस्तेमाल करके भी फ़ंक्शन लागू किया जा सकता है. BigQuery के रिमोट फ़ंक्शन, Cloud Run फ़ंक्शन और Cloud Run के साथ सीधे तौर पर इंटिग्रेट होते हैं. एसक्यूएल क्वेरी में, 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 से मिले जवाबों के साथ जवाब देगा.
इलस्ट्रेशन
डेवलपमेंट के लिहाज़ से, इस कोडलैब में आपको ये चरण पूरे करने होंगे:
- Cloud Run फ़ंक्शन में एचटीटीपी एंडपॉइंट बनाना
- Cloud_6 टाइप का कनेक्शन बनाएं
- Cloud Storage बकेट के लिए BigQuery ऑब्जेक्ट टेबल बनाना
- रिमोट फ़ंक्शन बनाना
- उपयोगकर्ता के तय किए गए किसी भी दूसरे फ़ंक्शन की तरह ही, क्वेरी में रिमोट फ़ंक्शन का इस्तेमाल करना
आपको इनके बारे में जानकारी मिलेगी
- Python में एचटीटीपी Cloud Run फ़ंक्शन बनाने का तरीका
- एसक्यूएल क्वेरी में BigQuery रिमोट फ़ंक्शन बनाने और उसे इस्तेमाल करने का तरीका
- BigQuery ऑब्जेक्ट टेबल बनाने का तरीका
- विज़ुअल क्वेश्चन आंसरिंग (वीक्यूए) का इस्तेमाल करने के लिए, Python के लिए Vertex AI SDK का इस्तेमाल करने का तरीका
2. सेटअप और ज़रूरी शर्तें
ज़रूरी शर्तें
- आपने Cloud Console में लॉग इन किया हो.
- आपने पहले एक HTTP 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. क्लाउड रन फ़ंक्शन बनाना
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
इसके बाद, VQA के इस्तेमाल के लिए एक इमेज अपलोड करें. यह कोडलैब, 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 रिसॉर्स कनेक्शन बनाना
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 क्वेरी को किसी वैरिएबल में सेव करें.
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 फ़ंक्शन को कॉल किया जा सकता है.
सबसे पहले, अपने सवाल और एसक्यूएल क्वेरी को किसी वैरिएबल में सेव करें. इस कोडलैब में, विज़ुअल सवालों के जवाब देने वाले मॉडल के दस्तावेज़ में दिए गए उदाहरण का इस्तेमाल किया गया है. यह क्वेरी, आपके स्टोरेज बकेट में जोड़ी गई नई इमेज का इस्तेमाल करती है.
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
के बाद /*
पाथ शामिल किया हो.
अगर आपको अपनी SQL क्वेरी चलाते समय गड़बड़ी Access Denied: BigQuery BigQuery: Received response code 403 from endpoint <your-function-endpoint>
का मैसेज मिलता है, तो फिर से कोशिश करने से पहले, Cloud फ़ंक्शन को ट्रिगर करने वाले व्यक्ति को मिली भूमिका की अनुमति, BigQuery कनेक्शन सेवा खाते में लागू होने में करीब 1-2 मिनट लगते हैं. इसलिए, इस दौरान इंतज़ार करें.
11. बधाई हो!
कोडलैब पूरा करने के लिए बधाई!
हमारा सुझाव है कि आप BigQuery के रिमोट फ़ंक्शन और विज़ुअल क्वेश्चन आंसरिंग (वीक्यूए) के दस्तावेज़ देखें.
हमने क्या-क्या शामिल किया है
- 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
चलाकर, सभी उपलब्ध प्रोजेक्ट की सूची देखी जा सकती है.