1. Giriş
Genel Bakış
BigQuery uzak işlevleri, SQL ve JavaScript dışındaki dillerde veya BigQuery kullanıcı tanımlı işlevlerinde izin verilmeyen kitaplıklar ve hizmetlerle işlev uygulamanıza olanak tanır. BigQuery uzak işlevleri, Cloud Run işlevleri ve Cloud Run ile doğrudan entegrasyon sağlar. Bir veya daha fazla sütunu giriş olarak alıp çıkış olarak tek bir değer döndürerek SQL sorgusunda BigQuery uzak işlevini çağırabilirsiniz.
Cloud Run işlevleri, bir sunucu veya çalışma zamanı ortamını yönetme gereği duymadan HTTPS kullanılarak tetiklenebilen ya da CloudEvents'e yanıt veren tek amaçlı bağımsız işlevler oluşturmak için geliştiriciler tarafından kullanılabilecek hafif bir bilgi işlem çözümüdür. Cloud Run işlevleri Node.js, Python, Go, Java, .NET, Ruby ve PHP'yi destekler.
Bu codelab'de, Vertex AI Visual Question Answering (VQA)'yı kullanarak Cloud Storage'da depolanan resimlerle ilgili soruların yanıtlarını almak için BigQuery uzaktan işlevi oluşturmayı öğreneceksiniz. SQL sorgunuz, BigQuery'deki bir tablodan resmin URI'sini alır. Ardından, BigQuery uzak işlevini kullanarak resim URI'sini, resimle ilgili VQA yanıtlarını döndüren bir Cloud Run işlevine göndereceksiniz.
Resim

Geliştirme açısından bu codelab'de tamamlayacağınız adımlar şunlardır:
- Cloud Run işlevlerinde HTTP uç noktası oluşturma
- CLOUD_RESOURCE türünde bir bağlantı oluşturma
- Cloud Storage paketi için BigQuery nesne tablosu oluşturma
- Uzak işlevi oluşturma
- Uzak işlevi, diğer kullanıcı tanımlı işlevler gibi bir sorguda kullanın.
Neler öğreneceksiniz?
- Python'da HTTP Cloud Run işlevi oluşturma
- SQL sorgusunda BigQuery Remote Function oluşturma ve kullanma
- BigQuery nesne tablosu oluşturma
- Görsel Soru Cevaplama (VQA)'yı kullanmak için Python için Vertex AI SDK'yı kullanma
2. Kurulum ve Gereksinimler
Ön koşullar
- Cloud Console'a giriş yapmış olmanız gerekir.
- Daha önce bir HTTP Cloud Run işlevi dağıtmış olmanız gerekir. Python hızlı başlangıç kılavuzuna göz atın.
- Daha önce Cloud Storage'da bir paket oluşturmuş olmanız gerekir. Cloud Storage hızlı başlangıç kılavuzuna bakın.
- BigQuery'de veri kümesi, tablo ve uzak işlev oluşturmak için uygun rollere sahip olmanız gerekir. BigQuery'de Veri Yükleme ve Sorgulama hızlı başlangıç kılavuzuna bakın.
Cloud Shell'i etkinleştirme
- Cloud Console'da Cloud Shell'i etkinleştir 'i
tıklayın.

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara ekran gösterildiyse Devam'ı tıklayın.

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

Bu sanal makineye, ihtiyaç duyacağınız tüm geliştirme araçları yüklenmiştir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını tarayıcıyla yapabilirsiniz.
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.
- Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu komutu çalıştırın:
gcloud auth list
Komut çıkışı
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- gcloud komutunun projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project
Komut çıkışı
[core] project = <PROJECT_ID>
Değilse şu komutla ayarlayabilirsiniz:
gcloud config set project <PROJECT_ID>
Komut çıkışı
Updated property [core/project].
3. Yerel ortam değişkenlerini ayarlama
Bu kodda, bu codelab'de kullanılan gcloud komutlarının okunabilirliğini artırmak için birkaç ortam değişkeni oluşturacaksınız.
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 işlevini oluşturma
BigQuery uzak işlevi oluşturmak için önce Cloud Run işlevini kullanarak bir HTTP uç noktası oluşturmanız gerekir. Uç nokta, tek bir HTTP POST isteğinde bir satır grubunu işleyebilmeli ve grubun sonuçlarını HTTP yanıtı olarak döndürebilmelidir.
Bu Cloud Run işlevi, SQL sorgunuzdan giriş olarak görüntü depolama URI'sini ve soru istemini alır ve Visual Question Answering'den (VQA) yanıt döndürür.
Bu codelab'de, Python için Vertex AI SDK'yı kullanan python311 çalışma zamanına yönelik bir örnek verilmektedir.
İşlevin kaynak kodunu oluşturma
Öncelikle bir dizin oluşturun ve bu dizine gidin.
mkdir imagen-vqa && cd $_
Ardından, requirements.txt dosyası oluşturun.
google-cloud-aiplatform[preview] google-cloud-storage functions-framework==3.*
Ardından, bir main.py kaynak dosyası oluşturun.
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 işlevini dağıtma
Artık python311 çalışma zamanı için Cloud Run işlevinizi dağıtabilirsiniz.
Cloud Run işlevini doğrudan Cloud Run'a dağıtmak için aşağıdaki komutu çalıştırın:
gcloud beta run deploy $FUNCTION_NAME \
--source . \
--function imagen_vqa \
--region $FUNCTION_REGION \
--no-allow-unauthenticated
Cloud Functions 2. nesil olarak dağıtmayı tercih ederseniz aşağıdaki komutu kullanın:
gcloud functions deploy $FUNCTION_NAME \ --gen2 \ --region=$FUNCTION_REGION \ --runtime=python311 \ --trigger-http \ --source=. \ --no-allow-unauthenticated
Ardından, işlev URL'sini daha sonra kullanmak üzere ortam değişkeni olarak kaydedebilirsiniz.
ENDPOINT_URL="$(gcloud beta run services describe $FUNCTION_NAME --region $FUNCTION_REGION --format='value(status.url)')"
5. Cloud Storage paketi oluşturma
Öncelikle, resimlerinizi depolamak için bir Cloud Storage paketi oluşturun.
gcloud storage buckets create gs://$BUCKET_NAME
Ardından, VQA'nın kullanması için bir resim yükleyin. Bu codelab'de, VQA dokümanlarındaki örnek resim kullanılmaktadır.
Resmi doğrudan paketinize yüklemek için Cloud Storage'a yönelik Cloud Console'u kullanabilirsiniz. Alternatif olarak, örnek resmi mevcut Cloud Shell dizininize indirmek için aşağıdaki komutları çalıştırabilirsiniz.
wget -O image.jpg -o /dev/null https://unsplash.com/photos/QqN25A3iF9w/download?ixid=M3wxMjA3fDB8MXxhbGx8fHx8fHx8fHwxNjk1NzYxMjY2fA&force=true
Ardından Cloud Storage paketinize yükleyin.
gcloud storage cp image.jpg gs://$BUCKET_NAME
6. BigQuery Cloud Resource bağlantısı oluşturma
BigQuery, Cloud Function'ınızla etkileşim kurmak için CLOUD_RESOURCE bağlantısını kullanır. Bu bağlantıyı oluşturmak için aşağıdaki komutu çalıştırın.
bq mk --connection --location=$BQ_REGION --project_id=$PROJECT_ID \ --connection_type=CLOUD_RESOURCE $CONNECTION_ID
Ardından, yeni BigQuery bağlantısının ayrıntılarını görüntüleyin.
bq show --connection $PROJECT_ID.$BQ_REGION.$CONNECTION_ID
BigQuery bağlantısı hizmet hesabının adını, gösterildiği gibi bir değişkene kaydedin.
CONNECTION_SA="<YOUR-SERVICE-ACCOUNT-ID>@gcp-sa-bigquery-condel.iam.gserviceaccount.com"
Hizmet hesabına, Cloud Storage paketinize erişim izni verin.
gsutil iam ch serviceAccount:$CONNECTION_SA:objectAdmin gs://$BUCKET_NAME
7. BigQuery nesne tablosu oluşturma
BigQuery nesne tabloları, Cloud Storage'da bulunan yapılandırılmamış veri nesneleri üzerindeki salt okunur tablolardır.
Nesne tabloları, Cloud Storage'daki yapılandırılmamış verileri analiz etmenize olanak tanır. Uzak işlevlerle analiz yapabilir, ardından bu işlemlerin sonuçlarını BigQuery'deki yapılandırılmış verilerinizin geri kalanıyla birleştirebilirsiniz.
Öncelikle bir veri kümesi oluşturun.
bq --location=$BQ_REGION mk \
--dataset \
$DATASET_ID
Aşağıdaki komut, Cloud Storage görüntü paketinize dayalı bir nesne tablosu oluşturur. Elde edilen tabloda, söz konusu paketteki tüm resimlerin URI'leri yer alır.
bq mk --table \ --external_table_definition=gs://$BUCKET_NAME/*@$BQ_REGION.$CONNECTION_ID \ --object_metadata=SIMPLE \ $PROJECT_ID:$DATASET_ID.$TABLE_NAME
8. BigQuery uzak işlevini oluşturma
Son adım, BigQuery uzak işlevini yapılandırmaktır.
İlk olarak, BigQuery bağlantısı hizmet hesabına Cloud Run işlevini çağırma izni verin. Cloud Run işlevi hizmetiniz için kimliği doğrulanmamış çağırmaya izin vermeniz önerilmez.
gcloud run services add-iam-policy-binding $FUNCTION_NAME \ --member=serviceAccount:$CONNECTION_SA \ --role="roles/run.invoker" \ --region $FUNCTION_REGION
Ardından, SQL sorgusunu bir değişkene kaydedin.
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' )"
Şimdi sorguyu çalıştırın.
bq query --nouse_legacy_sql $SQL_CREATE_FUNCTION
Uzak işlevi oluşturmak için sorguyu çalıştırdıktan sonra Created <your-project-id>.remote_function_codelab.vqa ifadesini görürsünüz.
9. SQL sorgusunda BigQuery uzak işlevini çağırma
Uzak işlev oluşturmayla ilgili geliştirme adımlarını tamamladınız. Artık Cloud Run işlevinizi bir SQL sorgusundan çağırabilirsiniz.
Öncelikle sorunuzu ve SQL sorgunuzu bir değişkene kaydedin. Bu codelab'de, Görsel Soru Yanıtlama dokümanlarındaki örnek kullanılıyor. Bu sorgu, depolama paketinize eklenen en son resmi kullanır.
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; "
Ardından, Vertex AI Visual Question Answering (VQA) hizmetinden gelen yanıtı göstermek için SQL sorgusunu çalıştırın.
bq query --nouse_legacy_sql $SQL_QUERY
Sonuçlar, aşağıdaki örnek çıkışa benzer şekilde görünmelidir:
+---------------------------------+--------------------------------+----------+ | uri | image_prompt | result | +---------------------------------+--------------------------------+----------+ | gs://<YOUR_BUCKET>/image.jpg | What objects are in the image? | marbles | +---------------------------------+--------------------------------+----------+
10. Sorun giderme
BigQuery tablosunu oluştururken BigQuery error in mk operation: Source URI must be a Google Cloud Storage location: gs://$BUCKET_NAME hatası alırsanız komutta $BUCKET_NAME sonrasına /* yolunu eklediğinizden emin olun.
SQL sorgunuzu çalıştırırken Access Denied: BigQuery BigQuery: Received response code 403 from endpoint <your-function-endpoint> hatası alırsanız yeniden denemeden önce Cloud Function Invoker rolü izni verme işleminin BigQuery bağlantı hizmeti hesabına yayılması için yaklaşık 1-2 dakika beklemeyi deneyin.
11. Tebrikler!
Tebrikler, codelab'i tamamladınız.
BigQuery Remote Functions ve Visual Question Answering (VQA) ile ilgili belgeleri incelemenizi öneririz.
İşlediğimiz konular
- Cloud Run işlevinde kimlik doğrulamayı yapılandırma ve kimlik doğrulamanın düzgün şekilde yapılandırıldığını doğrulama
- gcloud kimliğinizin jetonunu sağlayarak yerel bir geliştirme ortamından kimliği doğrulanmış bir işlevi çağırma
- Hizmet hesabı oluşturma ve işlevi çağırmak için uygun rolü verme
- Bir işlevi çağırmak için uygun rollere sahip yerel bir geliştirme ortamından bir hizmetin kimliğine bürünme
12. Temizleme
Yanlışlıkla ücretlendirilmemek için (örneğin, bu Cloud Run işlevi ücretsiz katmandaki aylık Cloud Run işlevi çağırma tahsisinizden daha fazla sayıda çağrılırsa) Cloud Functions işlevini veya 2. adımda oluşturduğunuz projeyi silebilirsiniz.
Cloud Run işlevini silmek için https://console.cloud.google.com/functions/ adresinden Cloud Run Cloud Console'a gidin ve imagen-vqa işlevini (veya farklı bir ad kullandıysanız $FUNCTION_NAME) silin.
Projenin tamamını silmeyi tercih ederseniz https://console.cloud.google.com/cloud-resource-manager adresine gidebilir, 2. adımda oluşturduğunuz projeyi seçip Sil'i tıklayabilirsiniz. Projeyi silerseniz Cloud SDK'nızda projeleri değiştirmeniz gerekir. gcloud projects list komutunu çalıştırarak kullanılabilir tüm projelerin listesini görüntüleyebilirsiniz.