1. Giới thiệu
Tổng quan
Hàm từ xa của BigQuery cho phép bạn triển khai một hàm bằng các ngôn ngữ khác ngoài SQL và JavaScript hoặc bằng các thư viện và dịch vụ không được phép trong hàm do người dùng xác định của BigQuery. Các hàm từ xa của BigQuery cung cấp khả năng tích hợp trực tiếp với các hàm trong Cloud Run và Cloud Run. Bạn có thể gọi một hàm từ xa của BigQuery trong truy vấn SQL bằng cách lấy một hoặc nhiều cột làm dữ liệu đầu vào, sau đó trả về một giá trị duy nhất làm dữ liệu đầu ra.
Hàm Cloud Run là một giải pháp điện toán gọn nhẹ để nhà phát triển tạo các hàm độc lập, có mục đích đơn lẻ có thể được kích hoạt bằng HTTPS hoặc phản hồi CloudEvents mà không cần quản lý máy chủ hoặc môi trường thời gian chạy. Các hàm Cloud Run hỗ trợ Node.js, Python, Go, Java, .NET, Ruby và PHP.
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách tạo một hàm từ xa BigQuery để nhận câu trả lời cho câu hỏi về hình ảnh được lưu trữ trong Cloud Storage bằng tính năng Trả lời câu hỏi bằng hình ảnh (VQA) của Vertex AI. Truy vấn SQL của bạn sẽ truy xuất URI cho hình ảnh từ một bảng trong BigQuery. Sau đó, bằng cách sử dụng một hàm từ xa của BigQuery, bạn sẽ gửi URI hình ảnh đến một hàm Cloud Run. Hàm này sẽ phản hồi bằng câu trả lời của VQA về hình ảnh.
Hình minh họa
Từ góc độ phát triển, đây là các bước bạn sẽ hoàn thành trong lớp học lập trình này:
- Tạo điểm cuối HTTP trong các hàm Cloud Run
- Tạo kết nối thuộc loại CLOUD_ hướng
- Tạo bảng đối tượng BigQuery cho bộ chứa Cloud Storage
- Tạo hàm từ xa
- Sử dụng hàm từ xa trong truy vấn giống như mọi hàm do người dùng xác định khác
Kiến thức bạn sẽ học được
- Cách tạo hàm HTTP Cloud Run trong Python
- Cách tạo và sử dụng Hàm từ xa BigQuery trong truy vấn SQL
- Cách tạo bảng đối tượng BigQuery
- Cách sử dụng SDK Vertex AI cho Python để sử dụng tính năng Trả lời câu hỏi bằng hình ảnh (VQA)
2. Cách thiết lập và các yêu cầu
Điều kiện tiên quyết
- Bạn đã đăng nhập vào Cloud Console.
- Trước đây, bạn đã triển khai một hàm HTTP Cloud Run. Xem hướng dẫn bắt đầu nhanh về Python.
- Bạn đã tạo một bộ chứa trong Cloud Storage. Xem hướng dẫn bắt đầu nhanh về Cloud Storage.
- Bạn có các vai trò thích hợp để tạo tập dữ liệu, bảng và hàm từ xa trong BigQuery. Xem phần Bắt đầu nhanh về dữ liệu tải và truy vấn trong BigQuery.
Kích hoạt Cloud Shell
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell .
Nếu đây là lần đầu tiên bạn khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn thấy một màn hình trung gian, hãy nhấp vào Tiếp tục.
Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.
Máy ảo này được tải tất cả các công cụ phát triển cần thiết. Ứng dụng này cung cấp một thư mục gốc 5 GB ổn định và chạy trong Google Cloud, giúp cải thiện đáng kể hiệu suất mạng và xác thực. Bạn có thể thực hiện hầu hết (nếu không phải tất cả) công việc trong lớp học lập trình này bằng trình duyệt.
Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án được đặt thành mã dự án của bạn.
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list
Kết quả của lệnh
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project
Kết quả của lệnh
[core] project = <PROJECT_ID>
Nếu chưa, bạn có thể thiết lập chế độ này bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Kết quả của lệnh
Updated property [core/project].
3. Thiết lập biến môi trường cục bộ
Trong mã này, bạn sẽ tạo một vài biến môi trường để cải thiện khả năng đọc của các lệnh gcloud
được sử dụng trong lớp học lập trình này.
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. Tạo hàm Cloud Run
Để tạo một chức năng từ xa của BigQuery, trước tiên, bạn phải tạo một điểm cuối HTTP bằng cách sử dụng hàm Cloud Run. Điểm cuối phải có khả năng xử lý một lô hàng trong một yêu cầu POST HTTP và trả về kết quả cho lô hàng dưới dạng phản hồi HTTP.
Hàm Cloud Run này sẽ nhận URI bộ nhớ hình ảnh và câu lệnh câu hỏi làm dữ liệu đầu vào từ truy vấn SQL của bạn, đồng thời trả về câu trả lời từ tính năng Trả lời câu hỏi bằng hình ảnh (VQA).
Lớp học lập trình này sử dụng một ví dụ về thời gian chạy python311 bằng SDK Vertex AI cho Python.
Tạo mã nguồn cho hàm
Trước tiên, hãy tạo một thư mục và chuyển vào thư mục đó.
mkdir imagen-vqa && cd $_
Sau đó, hãy tạo một tệp requirements.txt
.
google-cloud-aiplatform[preview] google-cloud-storage functions-framework==3.*
Tiếp theo, hãy tạo một tệp nguồn 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
Triển khai hàm Cloud Run
Giờ đây, bạn có thể triển khai hàm Cloud Run cho thời gian chạy python311.
Để triển khai trực tiếp một hàm Cloud Run trên Cloud Run, hãy chạy lệnh sau:
gcloud beta run deploy $FUNCTION_NAME \ --source . \ --function imagen_vqa \ --region $FUNCTION_REGION \ --no-allow-unauthenticated
Nếu bạn muốn triển khai dưới dạng Cloud Functions thế hệ 2, hãy sử dụng lệnh sau:
gcloud functions deploy $FUNCTION_NAME \ --gen2 \ --region=$FUNCTION_REGION \ --runtime=python311 \ --trigger-http \ --source=. \ --no-allow-unauthenticated
sau đó, bạn có thể lưu URL hàm dưới dạng biến môi trường để sử dụng sau.
ENDPOINT_URL="$(gcloud beta run services describe $FUNCTION_NAME --region $FUNCTION_REGION --format='value(status.url)')"
5. Tạo bộ chứa Cloud Storage
Trước tiên, hãy tạo một bộ chứa trên Cloud Storage để lưu trữ hình ảnh.
gcloud storage buckets create gs://$BUCKET_NAME
Tiếp theo, hãy tải một hình ảnh lên để VQA sử dụng. Lớp học lập trình này sử dụng hình ảnh mẫu trong tài liệu về VQA.
Bạn có thể sử dụng Cloud Console cho Cloud Storage để tải hình ảnh trực tiếp lên bộ chứa. Hoặc bạn có thể chạy các lệnh sau để tải hình ảnh mẫu xuống thư mục Cloud Shell hiện tại
wget -O image.jpg -o /dev/null https://unsplash.com/photos/QqN25A3iF9w/download?ixid=M3wxMjA3fDB8MXxhbGx8fHx8fHx8fHwxNjk1NzYxMjY2fA&force=true
rồi tải lên bộ chứa Cloud Storage.
gcloud storage cp image.jpg gs://$BUCKET_NAME
6. Tạo kết nối với BigQuery Cloud Resource
BigQuery sử dụng kết nối CLOUD_ hướng để tương tác với chức năng đám mây của bạn. Chạy lệnh sau để tạo kết nối này.
bq mk --connection --location=$BQ_REGION --project_id=$PROJECT_ID \ --connection_type=CLOUD_RESOURCE $CONNECTION_ID
Tiếp theo, hãy hiện thông tin chi tiết về kết nối BigQuery mới.
bq show --connection $PROJECT_ID.$BQ_REGION.$CONNECTION_ID
Lưu tên của tài khoản dịch vụ kết nối BigQuery vào một biến, như minh hoạ.
CONNECTION_SA="<YOUR-SERVICE-ACCOUNT-ID>@gcp-sa-bigquery-condel.iam.gserviceaccount.com"
Cấp quyền truy cập cho tài khoản dịch vụ để truy cập vào bộ chứa Cloud Storage của bạn.
gsutil iam ch serviceAccount:$CONNECTION_SA:objectAdmin gs://$BUCKET_NAME
7. Tạo Bảng đối tượng BigQuery
Bảng đối tượng BigQuery là các bảng chỉ có thể đọc trên các đối tượng dữ liệu không có cấu trúc nằm trong Bộ nhớ trên đám mây.
Bảng đối tượng cho phép bạn phân tích dữ liệu không có cấu trúc trong Cloud Storage. Bạn có thể thực hiện phân tích bằng các hàm từ xa, sau đó kết hợp kết quả của các thao tác này với phần còn lại của dữ liệu có cấu trúc trong BigQuery.
Trước tiên, hãy tạo một tập dữ liệu.
bq --location=$BQ_REGION mk \ --dataset \ $DATASET_ID
Lệnh sau đây sẽ tạo một bảng đối tượng dựa trên bộ chứa hình ảnh Cloud Storage của bạn. Bảng kết quả sẽ chứa URI cho tất cả hình ảnh trong bộ chứa đó.
bq mk --table \ --external_table_definition=gs://$BUCKET_NAME/*@$BQ_REGION.$CONNECTION_ID \ --object_metadata=SIMPLE \ $PROJECT_ID:$DATASET_ID.$TABLE_NAME
8. Tạo Hàm từ xa BigQuery
Bước cuối cùng là định cấu hình Hàm từ xa BigQuery.
Trước tiên, hãy cấp quyền cho tài khoản dịch vụ kết nối BigQuery để gọi hàm Cloud Run. Bạn không nên cho phép lệnh gọi chưa được xác thực đối với dịch vụ chức năng Cloud Run.
gcloud run services add-iam-policy-binding $FUNCTION_NAME \ --member=serviceAccount:$CONNECTION_SA \ --role="roles/run.invoker" \ --region $FUNCTION_REGION
Tiếp theo, hãy lưu Truy vấn SQL vào một biến.
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' )"
Bây giờ, hãy chạy truy vấn.
bq query --nouse_legacy_sql $SQL_CREATE_FUNCTION
Sau khi chạy truy vấn để tạo hàm từ xa, bạn sẽ thấy Created <your-project-id>.remote_function_codelab.vqa
9. Gọi Hàm từ xa của BigQuery trong truy vấn SQL
Bạn đã hoàn tất các bước phát triển để tạo hàm từ xa. Giờ đây, bạn có thể gọi hàm Cloud Run từ bên trong truy vấn SQL.
Trước tiên, hãy lưu câu hỏi và Truy vấn SQL vào một biến. Lớp học lập trình này sử dụng ví dụ trong tài liệu về tính năng Trả lời câu hỏi bằng hình ảnh. Truy vấn này sử dụng hình ảnh mới nhất được thêm vào bộ chứa bộ nhớ của bạn.
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; "
Sau đó, hãy chạy Truy vấn SQL để hiển thị phản hồi từ dịch vụ Trả lời câu hỏi bằng hình ảnh (VQA) của Vertex AI.
bq query --nouse_legacy_sql $SQL_QUERY
Kết quả sẽ tương tự như kết quả mẫu bên dưới:
+---------------------------------+--------------------------------+----------+ | uri | image_prompt | result | +---------------------------------+--------------------------------+----------+ | gs://<YOUR_BUCKET>/image.jpg | What objects are in the image? | marbles | +---------------------------------+--------------------------------+----------+
10. Khắc phục sự cố
Khi tạo bảng BigQuery, nếu bạn gặp lỗi BigQuery error in mk operation: Source URI must be a Google Cloud Storage location: gs://$BUCKET_NAME
, hãy đảm bảo bạn đã thêm đường dẫn /*
sau $BUCKET_NAME
trong lệnh.
Khi chạy truy vấn SQL, nếu bạn gặp lỗi Access Denied: BigQuery BigQuery: Received response code 403 from endpoint <your-function-endpoint>
, hãy thử đợi khoảng 1 đến 2 phút để quyền cấp vai trò Invoker trên đám mây truyền đến tài khoản dịch vụ kết nối BigQuery trước khi thử lại.
11. Xin chúc mừng!
Chúc mừng bạn đã hoàn thành lớp học lập trình!
Bạn nên xem lại tài liệu về Hàm từ xa BigQuery và Trả lời câu hỏi bằng hình ảnh (VQA).
Nội dung đã đề cập
- Cách định cấu hình tính năng xác thực trên một hàm Cloud Run và xác minh tính năng xác thực đã được định cấu hình đúng cách
- Gọi một hàm đã xác thực từ môi trường phát triển cục bộ bằng cách cung cấp mã thông báo cho danh tính gcloud của bạn
- Cách tạo tài khoản dịch vụ và cấp cho tài khoản đó vai trò thích hợp để gọi một hàm
- Cách mạo danh một dịch vụ từ môi trường phát triển cục bộ có các vai trò thích hợp để gọi một hàm
12. Dọn dẹp
Để tránh bị tính phí do nhầm lẫn (ví dụ: nếu hàm Cloud Run này vô tình được gọi nhiều lần hơn mức phân bổ số lần gọi hàm Cloud Run hằng tháng trong cấp miễn phí), bạn có thể xoá Hàm trên đám mây hoặc xoá dự án mà bạn đã tạo ở Bước 2.
Để xoá hàm Cloud Run, hãy truy cập vào Cloud Console của Cloud Run tại https://console.cloud.google.com/functions/ rồi xoá hàm imagen-vqa (hoặc $FUNCTION_NAME trong trường hợp bạn đã sử dụng tên khác).
Nếu chọn xoá toàn bộ dự án, bạn có thể truy cập vào https://console.cloud.google.com/cloud-resource-manager, chọn dự án mà bạn đã tạo ở Bước 2 rồi chọn Xoá. Nếu xoá dự án, bạn sẽ cần thay đổi các dự án trong SDK trên đám mây. Bạn có thể xem danh sách tất cả dự án hiện có bằng cách chạy gcloud projects list
.