יצירה וחיפוש של הטמעות מרובות מצבים
במדריך הזה מוסבר איך ליצור הטבעות (embeddings) מולטי-מודאליות לתמונות ולטקסט באמצעות BigQuery ו-Vertex AI, ואז להשתמש בהטבעות האלה כדי לבצע חיפוש סמנטי של יצירת תמונות לפי טקסט.
במדריך הזה מוסבר איך לבצע את הפעולות הבאות:
- יצירת טבלת אובייקטים ב-BigQuery על נתוני תמונות בקטגוריה של Cloud Storage.
- בדיקת נתוני התמונות באמצעות מחברת Colab Enterprise ב-BigQuery.
- יצירת מודל מרוחק של BigQuery ML שמכוון למודל בסיס של Vertex AI
multimodalembedding. - שימוש במודל מרוחק עם הפונקציה
AI.GENERATE_EMBEDDINGכדי ליצור הטמעות מהתמונות בטבלת האובייקטים. - מתקנים שגיאות שקרו במהלך יצירת ההטמעה.
- אופציונלי: אפשר ליצור אינדקס וקטורי כדי ליצור אינדקס של הטמעות התמונות.
- יצירת הטמעת טקסט למחרוזת חיפוש נתונה.
- שימוש בפונקציה
VECTOR_SEARCHכדי לבצע חיפוש סמנטי של הטמעות תמונות שדומות להטמעת הטקסט. - הדמיה של התוצאות באמצעות מחברת.
במדריך הזה נעשה שימוש בתמונות אומנותיות בדומיין הציבורי ממוזיאון המטרופוליטן לאומנות, שזמינות בקטגוריה הציבורית gcs-public-data--met ב-Cloud Storage.
התפקידים הנדרשים
כדי להפעיל את המדריך הזה, אתם צריכים את התפקידים הבאים בניהול הזהויות והרשאות הגישה (IAM):
- יצירה ושימוש במערכי נתונים, בחיבורים, במודלים ובמחברות של BigQuery:
אדמין של BigQuery Studio (
roles/bigquery.studioAdmin). - נותנים הרשאות לחשבון השירות של החיבור: אדמין IAM של פרויקט (
roles/resourcemanager.projectIamAdmin).
התפקידים המוגדרים מראש האלה כוללים את ההרשאות שנדרשות לביצוע המשימות שמתוארות במסמך הזה. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:
ההרשאות הנדרשות
- יצירת מערך נתונים:
bigquery.datasets.create - יצירה, הקצאה ושימוש בחיבור:
bigquery.connections.* - הגדרת החיבור המוגדר כברירת מחדל:
bigquery.config.* - מגדירים את ההרשאות לחשבון השירות:
resourcemanager.projects.getIamPolicyו-resourcemanager.projects.setIamPolicy - יצירת טבלת אובייקטים:
bigquery.tables.createו-bigquery.tables.update - יצירת מודל והרצת הסקה:
bigquery.jobs.createbigquery.models.createbigquery.models.getDatabigquery.models.updateDatabigquery.models.updateMetadata
- ליצור מחברות ולהשתמש בהן:
resourcemanager.projects.getresourcemanager.projects.listbigquery.config.getbigquery.jobs.createbigquery.readsessions.createbigquery.readsessions.getDatabigquery.readsessions.updatedataform.locations.getdataform.locations.listdataform.repositories.create
.dataform.repositories.listdataform.collections.createdataform.collections.listaiplatform.notebookRuntimeTemplates.applyaiplatform.notebookRuntimeTemplates.getaiplatform.notebookRuntimeTemplates.listaiplatform.notebookRuntimeTemplates.getIamPolicyaiplatform.notebookRuntimes.assignaiplatform.notebookRuntimes.getaiplatform.notebookRuntimes.listaiplatform.operations.listaiplatform.notebookRuntimeTemplates.apply
יכול להיות שתוכלו לקבל את ההרשאות האלה גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
- BigQuery ML: You incur costs for the data that you process in BigQuery.
- Vertex AI: You incur costs for calls to the Vertex AI service that's represented by the remote model.
כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אפשר להשתמש במחשבון התמחור.
מידע נוסף על התמחור של BigQuery זמין במאמר תמחור ב-BigQuery במסמכי התיעוד של BigQuery.
מידע נוסף על התמחור של Vertex AI זמין בדף התמחור של Vertex AI.
לפני שמתחילים
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
יצירת מערך נתונים
יוצרים מערך נתונים ב-BigQuery לאחסון מודל ה-ML.
המסוף
במסוף Google Cloud , עוברים לדף BigQuery.
בחלונית Explorer, לוחצים על שם הפרויקט.
לוחצים על הצגת פעולות > יצירת מערך נתונים.
בדף Create dataset, מבצעים את הפעולות הבאות:
בשדה Dataset ID (מזהה מערך הנתונים), מזינים
bqml_tutorial.בקטע Location type, בוחרים באפשרות במספר אזורים ואז באפשרות US (multiple regions in United States).
משאירים את שאר הגדרות ברירת המחדל כמו שהן ולוחצים על Create dataset (יצירת מערך נתונים).
BQ
כדי ליצור מערך נתונים חדש, משתמשים בפקודה bq mk עם הדגל --location. רשימה מלאה של הפרמטרים האפשריים זמינה במאמר בנושא הפקודה bq mk --dataset.
יוצרים מערך נתונים בשם
bqml_tutorialעם מיקום הנתונים שמוגדר ל-USותיאור שלBigQuery ML tutorial dataset:bq --location=US mk -d \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
במקום להשתמש בדגל
--dataset, הפקודה משתמשת בקיצור הדרך-d. אם לא מציינים את-dואת--dataset, ברירת המחדל של הפקודה היא יצירת מערך נתונים.בודקים שמערך הנתונים נוצר:
bq ls
API
מבצעים קריאה לשיטה datasets.insert עם משאב מוגדר של מערך נתונים.
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
יצירת טבלת האובייקטים
יוצרים טבלת אובייקטים על תמונות האומנות בgcs-public-data--met קטגוריית Cloud Storage הציבורית.
טבלת האובייקטים מאפשרת לנתח את התמונות בלי להעביר אותן מ-Cloud Storage.
במסוף Google Cloud , עוברים לדף BigQuery.
בעורך השאילתות, מריצים את השאילתה הבאה:
CREATE OR REPLACE EXTERNAL TABLE `bqml_tutorial.met_images` WITH CONNECTION DEFAULT OPTIONS ( object_metadata = 'SIMPLE', uris = ['gs://gcs-public-data--met/*'] );
עיון בנתוני התמונה
יוצרים מסמך notebook של Colab Enterprise ב-BigQuery כדי לבדוק את נתוני התמונות.
במסוף Google Cloud , עוברים לדף BigQuery.
מגדירים את המחברת:
- מוסיפים תא קוד ל-Notebook.
מעתיקים את הקוד הבא ומדביקים אותו בתא הקוד:
#@title Set up credentials from google.colab import auth auth.authenticate_user() print('Authenticated') PROJECT_ID='PROJECT_ID' from google.cloud import bigquery client = bigquery.Client(PROJECT_ID)מחליפים את
PROJECT_IDבשם הפרויקט שבו משתמשים במדריך הזה.מריצים את תא הקוד.
הפעלת תצוגת הטבלה:
- מוסיפים תא קוד ל-Notebook.
מעתיקים את הקוד הבא ומדביקים אותו בתא הקוד:
#@title Enable data table display %load_ext google.colab.data_tableמריצים את תא הקוד.
יוצרים פונקציה להצגת התמונות:
- מוסיפים תא קוד ל-Notebook.
מעתיקים את הקוד הבא ומדביקים אותו בתא הקוד:
#@title Util function to display images import io from PIL import Image import matplotlib.pyplot as plt import tensorflow as tf def printImages(results): image_results_list = list(results) amt_of_images = len(image_results_list) fig, axes = plt.subplots(nrows=amt_of_images, ncols=2, figsize=(20, 20)) fig.tight_layout() fig.subplots_adjust(hspace=0.5) for i in range(amt_of_images): gcs_uri = image_results_list[i][0] text = image_results_list[i][1] f = tf.io.gfile.GFile(gcs_uri, 'rb') stream = io.BytesIO(f.read()) img = Image.open(stream) axes[i, 0].axis('off') axes[i, 0].imshow(img) axes[i, 1].axis('off') axes[i, 1].text(0, 0, text, fontsize=10) plt.show()מריצים את תא הקוד.
הצגת התמונות:
- מוסיפים תא קוד ל-Notebook.
מעתיקים את הקוד הבא ומדביקים אותו בתא הקוד:
#@title Display Met images inspect_obj_table_query = """ SELECT uri, content_type FROM bqml_tutorial.met_images WHERE content_type = 'image/jpeg' Order by uri LIMIT 10; """ printImages(client.query(inspect_obj_table_query))מריצים את תא הקוד.
התוצאות אמורות להיראות כך:
שומרים את ה-notebook בשם
met-image-analysis.
יצירת המודל המרוחק
יצירת מודל מרוחק שמייצג מודל הטמעה מולטימודאלי של Vertex AI שמתארח:
במסוף Google Cloud , עוברים לדף BigQuery.
בעורך השאילתות, מריצים את השאילתה הבאה:
CREATE OR REPLACE MODEL `bqml_tutorial.multimodal_embedding_model` REMOTE WITH CONNECTION DEFAULT OPTIONS (ENDPOINT = 'multimodalembedding@001');
השאילתה תימשך כמה שניות, ואז תוכלו לגשת ל
multimodal_embedding_modelמודל שמופיע בbqml_tutorialמערך הנתונים. מכיוון שהשאילתה משתמשת בהצהרהCREATE MODELכדי ליצור מודל, אין תוצאות לשאילתה.
יצירת הטבעות של תמונות
יוצרים הטבעות מהתמונות בטבלת האובייקטים באמצעות הפונקציה AI.GENERATE_EMBEDDING, ואז כותבים אותן לטבלה לשימוש בשלב הבא. יצירת הטמעה היא פעולה יקרה, ולכן השאילתה משתמשת בשאילתת משנה שכוללת את סעיף LIMIT כדי להגביל את יצירת ההטמעה ל-10,000 תמונות במקום להטמיע את קבוצת הנתונים המלאה של 601,294 תמונות. כך גם אפשר לשמור על מספר התמונות מתחת למגבלה של 25,000 עבור הפונקציה AI.GENERATE_EMBEDDING. הרצת השאילתה הזו תימשך כ-40 דקות.
במסוף Google Cloud , עוברים לדף BigQuery.
בעורך השאילתות, מריצים את השאילתה הבאה:
CREATE OR REPLACE TABLE `bqml_tutorial.met_image_embeddings` AS SELECT * FROM AI.GENERATE_EMBEDDING( MODEL `bqml_tutorial.multimodal_embedding_model`, (SELECT * FROM `bqml_tutorial.met_images` WHERE content_type = 'image/jpeg' LIMIT 10000))
תיקון שגיאות ביצירת הטמעה
בודקים אם יש שגיאות ביצירת ההטמעה ומתקנים אותן. יצירת הטמעה עלולה להיכשל בגלל מכסות של AI גנרטיבי ב-Vertex AI או בגלל שהשירות לא זמין.
הפונקציה AI.GENERATE_EMBEDDING מחזירה את פרטי השגיאה בעמודה status. העמודה הזו ריקה אם יצירת ההטמעה הצליחה, או שהיא מכילה הודעת שגיאה אם יצירת ההטמעה נכשלה.
במסוף Google Cloud , עוברים לדף BigQuery.
בעורך השאילתות, מריצים את השאילתה הבאה כדי לראות אם היו כשלים ביצירת הטמעה:
SELECT DISTINCT(status), COUNT(uri) AS num_rows FROM bqml_tutorial.met_image_embeddings GROUP BY 1;
אם מוחזרות שורות עם שגיאות, משמיטים את השורות שבהן יצירת ההטמעה נכשלה:
DELETE FROM `bqml_tutorial.met_image_embeddings` WHERE status = 'A retryable error occurred: RESOURCE_EXHAUSTED error from remote service/endpoint.';
יצירת אינדקס וקטורי
אפשר גם להשתמש בהצהרה CREATE VECTOR INDEX כדי ליצור את אינדקס הווקטור met_images_index בעמודה embedding של הטבלה met_images_embeddings.
אינדקס וקטורי מאפשר לבצע חיפוש וקטורי מהר יותר, אבל הוא מחזיר תוצאות משוערות יותר.
במסוף Google Cloud , עוברים לדף BigQuery.
בעורך השאילתות, מריצים את השאילתה הבאה:
CREATE OR REPLACE VECTOR INDEX `met_images_index` ON bqml_tutorial.met_image_embeddings(embedding) OPTIONS ( index_type = 'IVF', distance_type = 'COSINE');
אינדקס הווקטורים נוצר באופן אסינכרוני. כדי לבדוק אם נוצר אינדקס וקטורי, שולחים שאילתה לתצוגה
INFORMATION_SCHEMA.VECTOR_INDEXESומוודאים שהערך שלcoverage_percentageגדול מ-0, והערך שלlast_refresh_timeלא שווה ל-NULL:SELECT table_name, index_name, index_status, coverage_percentage, last_refresh_time, disable_reason FROM bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES WHERE index_name = 'met_images_index';
יצירת הטמעה לטקסט החיפוש
כדי לחפש תמונות שתואמות למחרוזת טקסט ספציפית לחיפוש, צריך קודם ליצור הטמעה של טקסט למחרוזת הזו. משתמשים באותו מודל מרוחק כדי ליצור את הטמעת הטקסט ששימשה ליצירת הטמעות התמונות, ואז כותבים את הטמעת הטקסט בטבלה לשימוש בשלב הבא. מחרוזת החיפוש היא pictures of white or cream colored dress from victorian era.
במסוף Google Cloud , עוברים לדף BigQuery.
בעורך השאילתות, מריצים את השאילתה הבאה:
CREATE OR REPLACE TABLE `bqml_tutorial.search_embedding` AS SELECT * FROM AI.GENERATE_EMBEDDING( MODEL `bqml_tutorial.multimodal_embedding_model`, ( SELECT 'pictures of white or cream colored dress from victorian era' AS content ) );
איך מבצעים חיפוש סמנטי של יצירת תמונות לפי טקסט
אפשר להשתמש בפונקציה
VECTOR_SEARCH
כדי לבצע חיפוש סמנטי של תמונות שתואמות בצורה הכי טובה למחרוזת החיפוש שמיוצגת על ידי הטמעת הטקסט.
במסוף Google Cloud , עוברים לדף BigQuery.
בעורך השאילתות, מריצים את השאילתה הבאה כדי לבצע חיפוש סמנטי ולכתוב את התוצאות בטבלה:
CREATE OR REPLACE TABLE `bqml_tutorial.vector_search_results` AS SELECT base.uri AS gcs_uri, distance FROM VECTOR_SEARCH( TABLE `bqml_tutorial.met_image_embeddings`, 'embedding', TABLE `bqml_tutorial.search_embedding`, 'embedding', top_k => 3);
הדמיה של תוצאות החיפוש הסמנטי
אפשר להשתמש במחברת כדי להציג את תוצאות החיפוש הסמנטי.
במסוף Google Cloud , עוברים לדף BigQuery.
פותחים את תיקיית ה-Notebook שיצרתם קודם.
met-image-analysisהדמיה של תוצאות החיפוש הווקטורי:
- מוסיפים תא קוד ל-Notebook.
מעתיקים את הקוד הבא ומדביקים אותו בתא הקוד:
query = """ SELECT * FROM `bqml_tutorial.vector_search_results` ORDER BY distance; """ printImages(client.query(query))מריצים את תא הקוד.
התוצאות אמורות להיראות כך:
הסרת המשאבים
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.