ביצוע חיזויים באמצעות מודלים של PyTorch בפורמט ONNX

Open Neural Network Exchange‏ (ONNX) מספק פורמט אחיד שנועד לייצג כל מסגרת של למידת מכונה. התמיכה של BigQuery ML ב-ONNX מאפשרת לכם:

  • אימון מודל באמצעות המסגרת המועדפת.
  • ממירים את המודל לפורמט מודל ONNX.
  • מייבאים את מודל ONNX ל-BigQuery ומבצעים חיזויים באמצעות BigQuery ML.

במדריך הזה מוסבר איך לייבא מודלים של ONNX שאומנו באמצעות PyTorch למערך נתונים ב-BigQuery, ואיך להשתמש בהם כדי ליצור תחזיות משאילתת SQL.

מטרות

  • מייבאים מודל שעבר אימון מראש באמצעות PyTorch.
  • ממירים את המודל לפורמט ONNX באמצעות torch.onnx.
  • משתמשים בהצהרה CREATE MODEL כדי לייבא את מודל ONNX ל-BigQuery.
  • משתמשים בפונקציה ML.PREDICT כדי ליצור תחזיות באמצעות מודל ONNX המיובא.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Cloud de Confiance by S3NS, והשימוש בהם כרוך בתשלום:

כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.

לפני שמתחילים

  1. In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. מוודאים שהחיוב מופעל בפרויקט Cloud de Confiance .

  3. מפעילים את ממשקי ה-API של BigQuery,‏ BigQuery Connection ו-Cloud Storage.

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק 'שימוש בשירות'' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    הפעלת ממשקי ה-API

  4. חשוב לוודא שיש לכם את ההרשאות הנדרשות לביצוע המשימות שמתוארות במסמך הזה.

התפקידים הנדרשים

אם תיצרו פרויקט חדש, אתם תהיו בעלי הפרויקט ותקבלו את כל ההרשאות הנדרשות לניהול זהויות והרשאות גישה (IAM) כדי להשלים את המדריך הזה.

אם אתם משתמשים בפרויקט קיים, מבצעים את הפעולות הבאות.

צריך לוודא שיש לכם בפרויקט את התפקיד או התפקידים הבאים:

בדיקת התפקידים

  1. נכנסים לדף IAM במסוף Cloud de Confiance .

    כניסה לדף IAM
  2. בוחרים את הפרויקט.
  3. בעמודה Principal, מחפשים את כל השורות שמזהות אתכם או קבוצה שאתם נכללים בה. כדי לברר באילו קבוצות אתם נכללים, פנו לאדמין.

  4. בודקים את העמודה Role בכל השורות שבהן מצוין או מופיע השם שלכם, כדי לראות אם רשימת התפקידים כוללת את התפקידים הנדרשים.

מתן התפקידים

  1. נכנסים לדף IAM במסוף Cloud de Confiance .

    כניסה לדף IAM
  2. בוחרים את הפרויקט.
  3. לוחצים על Grant access.
  4. בשדה New principals, מזינים את מזהה המשתמש. ‫ בדרך כלל זה המזהה של משתמש במאגר זהויות של כוח עבודה. למידע נוסף, קראו את המאמר ייצוג המשתמשים במאגרי כוח עבודה בכללי מדיניות IAM או פנו לאדמין שלכם.

  5. לוחצים על Select a role ומחפשים את התפקיד.
  6. כדי לתת עוד תפקידים, לוחצים על Add another role ומוסיפים אותם.
  7. לוחצים על Save.

מידע נוסף על הרשאות IAM ב-BigQuery זמין במאמר הרשאות IAM.

אופציונלי: אימון מודל והמרה שלו לפורמט ONNX

בדוגמאות הקוד הבאות אפשר לראות איך לייבא מודל סיווג שאומן מראש ל-PyTorch ואיך להמיר את המודל שמתקבל לפורמט ONNX. במדריך הזה נשתמש במודל לדוגמה מוכן מראש שמאוחסן בכתובת gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx. אם אתם משתמשים במודל לדוגמה, אין צורך לבצע את השלבים האלה.

יצירת מודל ראייה של PyTorch לסיווג תמונות

אפשר להשתמש בדוגמת הקוד הבאה כדי לייבא מודל resnet18 שאומן מראש ב-PyTorch ומקבל נתוני תמונה מפוענחים שמוחזרים על ידי הפונקציות ML.DECODE_IMAGE ו-ML.RESIZE_IMAGE של BigQuery ML.

import torch
import torch.nn as nn

# Define model input format to match the output format of
# ML.DECODE_IMAGE function: [height, width, channels]
dummy_input = torch.randn(1, 224, 224, 3, device="cpu")

# Load a pretrained pytorch model for image classification
model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet18', pretrained=True)

# Reshape input format from [batch_size, height, width, channels]
# to [batch_size, channels, height, width]
class ReshapeLayer(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, x):
        x = x.permute(0, 3, 1, 2)  # reorder dimensions
        return x

class ArgMaxLayer(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, x):
       return torch.argmax(x, dim=1)

final_model = nn.Sequential(
    ReshapeLayer(),
    model,
    nn.Softmax(),
    ArgMaxLayer()
)

המרת המודל לפורמט ONNX

כדי לייצא את מודל הראייה של PyTorch באמצעות torch.onnx, משתמשים בדוגמה הבאה. הקובץ המיוצא בפורמט ONNX נקרא resnet18.onnx.

torch.onnx.export(final_model,            # model being run
                  dummy_input,            # model input
                  "resnet18.onnx",        # where to save the model
                  opset_version=10,       # the ONNX version to export the model to
                  input_names = ['input'],         # the model's input names
                  output_names = ['class_label'])  # the model's output names

העלאת מודל ONNX ל-Cloud Storage

אחרי ששומרים את המודל:

יצירת מערך נתונים

יוצרים מערך נתונים ב-BigQuery לאחסון מודל ה-ML.

המסוף

  1. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    לדף BigQuery

  2. בחלונית Explorer, לוחצים על שם הפרויקט.

  3. לוחצים על הצגת פעולות > יצירת מערך נתונים.

  4. בדף Create dataset, מבצעים את הפעולות הבאות:

    • בשדה Dataset ID (מזהה מערך הנתונים), מזינים bqml_tutorial.

    • בקטע Location type, בוחרים באפשרות Multi-region ואז בוחרים באפשרות US.

    • משאירים את הגדרות ברירת המחדל שנותרו כמו שהן ולוחצים על Create dataset (יצירת מערך נתונים).

BQ

כדי ליצור מערך נתונים חדש, משתמשים בפקודה bq mk --dataset.

  1. יוצרים מערך נתונים בשם bqml_tutorial עם מיקום הנתונים שמוגדר ל-US.

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. בודקים שמערך הנתונים נוצר:

    bq ls

API

מבצעים קריאה לשיטה datasets.insert עם משאב מוגדר של מערך נתונים.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

ייבוא מודל ONNX ל-BigQuery

בשלבים הבאים מוסבר איך לייבא את מודל ONNX לדוגמה מ-Cloud Storage למערך הנתונים באמצעות הצהרת CREATE MODEL.

המסוף

  1. במסוף Cloud de Confiance , עוברים לדף BigQuery Studio.

    כניסה ל-BigQuery Studio

  2. בעורך השאילתות, מזינים את ההצהרה הבאה CREATE MODEL.

    CREATE OR REPLACE MODEL `bqml_tutorial.imported_onnx_model`
     OPTIONS (MODEL_TYPE='ONNX',
      MODEL_PATH='BUCKET_PATH')

    מחליפים את BUCKET_PATH בנתיב של המודל שהעליתם ל-Cloud Storage. אם אתם משתמשים במודל לדוגמה, מחליפים את BUCKET_PATH בערך הבא: gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx.

    בסיום הפעולה, תופיע הודעה דומה לזו: Successfully created model named imported_onnx_model.

    המודל החדש מופיע בחלונית משאבים. מודלים מסומנים בסמל המודל: סמל המודל בחלונית Resources (משאבים). אם בוחרים את המודל החדש בחלונית Resources, פרטים על המודל מופיעים לצד עורך השאילתות.

    חלונית המידע של `imported_onnx_model`.

BQ

  1. מייבאים את מודל ONNX מ-Cloud Storage על ידי הזנת ההצהרה הבאה CREATE MODEL.

    bq query --use_legacy_sql=false \
    "CREATE OR REPLACE MODEL
      `bqml_tutorial.imported_onnx_model`
    OPTIONS
      (MODEL_TYPE='ONNX',
       MODEL_PATH='BUCKET_PATH')"

    מחליפים את BUCKET_PATH בנתיב של המודל שהעליתם ל-Cloud Storage. אם אתם משתמשים במודל לדוגמה, מחליפים את BUCKET_PATH בערך הזה: gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx.

  2. אחרי שמייבאים את המודל, מוודאים שהוא מופיע במערך הנתונים.

    bq ls -m bqml_tutorial

    הפלט אמור להיראות כך:

    tableId               Type
    --------------------- -------
    imported_onnx_model  MODEL

למידע נוסף על ייבוא מודלים של ONNX ל-BigQuery, כולל דרישות הפורמט והאחסון, אפשר לעיין במאמר בנושא הצהרת CREATE MODEL לייבוא מודלים של ONNX.

יצירת טבלת אובייקטים ב-BigQuery לניתוח נתוני תמונות

טבלת אובייקטים היא טבלה לקריאה בלבד של אובייקטים של נתונים לא מובְנים שנמצאים ב-Cloud Storage. טבלאות אובייקטים מאפשרות לכם לנתח נתונים לא מובְנים מ-BigQuery.

במדריך הזה משתמשים בפונקציה ML.PREDICT כדי להפיק את תווית הסיווג החזויה של תמונת קלט שמאוחסנת בקטגוריה של Cloud Storage.

כדי ליצור את טבלת האובייקטים, צריך לבצע את הפעולות הבאות:

  • יצירת קטגוריה של Cloud Storage והעלאת תמונה של דג זהב.
  • יוצרים קישור למשאבים ב-Cloud שמשמש לגישה לטבלת האובייקטים.
  • מעניקים גישה לחשבון השירות של חיבור המשאב.

יצירת קטגוריה והעלאת תמונה

כדי ליצור קטגוריה של Cloud Storage ולהעלות תמונה של דג זהב, פועלים לפי השלבים הבאים.

המסוף

  1. במסוף Cloud de Confiance , נכנסים לדף Buckets של Cloud Storage.

    כניסה לדף Buckets

  2. לוחצים על יצירה.

  3. ממלאים את פרטי הקטגוריה בדף Create a bucket.

    1. בקטע Get started (תחילת העבודה), מבצעים את הפעולות הבאות:

      1. בתיבה, מזינים bqml_images.

      2. לוחצים על Continue.

    2. בקטע Choose where to store your data, מבצעים את הפעולות הבאות:

      1. בשדה Location type, בוחרים באפשרות Multi-region.

      2. בתפריט של סוג המיקום, בוחרים באפשרות ארה"ב (מספר אזורים בארצות הברית).

      3. לוחצים על Continue.

    3. בקטע Choose a storage class for your data:

      1. בוחרים באפשרות Set a default class.

      2. בוחרים באפשרות רגילה.

      3. לוחצים על Continue.

    4. בקטעים הנותרים, משאירים את ערכי ברירת המחדל.

  4. לוחצים על יצירה.

שורת הפקודה

מזינים את הפקודה gcloud storage buckets create הבאה:

gcloud storage buckets create gs://bqml_images --location=us

אם הבקשה מבוצעת בהצלחה, הפקודה תחזיר את ההודעה הבאה:

Creating gs://bqml_images/...

העלאת תמונה לקטגוריה שלכם ב-Cloud Storage

אחרי שיוצרים את הקטגוריה, מורידים תמונה של דג זהב ומעלים אותה לקטגוריה של Cloud Storage.

כדי להעלות את התמונה:

המסוף

  1. במסוף Cloud de Confiance , נכנסים לדף Buckets של Cloud Storage.

    כניסה לדף Buckets

  2. ברשימת הקטגוריות, לוחצים על bqml_images.

  3. בכרטיסייה Objects של הקטגוריה, מבצעים אחת מהפעולות הבאות:

    • גוררים את הקובץ משולחן העבודה או ממנהל הקבצים ומשחררים אותו בחלונית הראשית של Cloud de Confiance המסוף.

    • לוחצים על העלאה > העלאת קבצים, בוחרים את קובץ התמונה שרוצים להעלות בתיבת הדו-שיח שמופיעה ולוחצים על פתיחה.

שורת הפקודה

מזינים את הפקודה gcloud storage cp הבאה:

gcloud storage cp OBJECT_LOCATION gs://bqml_images/IMAGE_NAME

מחליפים את מה שכתוב בשדות הבאים:

  • OBJECT_LOCATION: הנתיב המקומי לקובץ התמונה. לדוגמה, Desktop/goldfish.jpg.
  • IMAGE_NAME: שם התמונה. לדוגמה, goldfish.jpg.

אם הפעולה בוצעה בהצלחה, התגובה תהיה דומה לדוגמה הבאה:

Completed files 1/1 | 164.3kiB/164.3kiB

יצירת קישור למשאבים ב-Cloud ב-BigQuery

כדי להתחבר לטבלת האובייקטים שתיצרו בהמשך המדריך הזה, צריך להיות לכם קישור למשאבים ב-Cloud.

חיבורים למשאבי ענן מאפשרים לשלוח שאילתות לנתונים שמאוחסנים מחוץ ל-BigQuery בשירותים כמו Cloud Storage או Spanner, או במקורות של צד שלישי כמו AWS או Azure. Cloud de Confiance החיבורים החיצוניים האלה משתמשים ב-BigQuery Connection API.

כדי ליצור קישור למשאבים ב-Cloud:

המסוף

  1. עוברים לדף BigQuery Studio.

    כניסה ל-BigQuery Studio

  2. בחלונית הימנית, לוחצים על כלי הניתוחים:

    כפתור מודגש לחלונית הסייר.

    אם החלונית הימנית לא מוצגת, לוחצים על הרחבת החלונית הימנית כדי לפתוח אותה.

  3. בחלונית Explorer, לוחצים על Add data.

    תיבת הדו-שיח הוספת נתונים נפתחת.

  4. בחלונית Filter By, בקטע Data Source Type, בוחרים באפשרות Databases.

    אפשרות אחרת היא להזין Vertex AI בשדה חיפוש מקורות נתונים.

  5. בקטע מקורות נתונים מומלצים, לוחצים על Vertex AI.

  6. לוחצים על כרטיס הפתרון Vertex AI Models: BigQuery Federation.

  7. ברשימה Connection type (סוג החיבור), בוחרים באפשרות Vertex AI remote models, remote functions and BigLake (Cloud Resource) (מודלים מרוחקים של Vertex AI, פונקציות מרוחקות ו-BigLake (משאב בענן)).

  8. בשדה מזהה החיבור, מזינים את הערך bqml_tutorial.

  9. מוודאים שהאפשרות Multi-region—US (מספר אזורים – ארה"ב) נבחרה.

  10. לוחצים על יצירת קישור.

  11. בתחתית החלון, לוחצים על מעבר לחיבור. אפשר גם ללחוץ על Connections בחלונית Explorer ואז על us.bqml_tutorial.

  12. בחלונית פרטי החיבור, מעתיקים את מזהה חשבון השירות. תצטרכו את המזהה הזה כשמגדירים הרשאות לחיבור. כשיוצרים משאב חיבור, BigQuery יוצר חשבון שירות ייחודי של המערכת ומקשר אותו לחיבור.

BQ

  1. כדי ליצור חיבור:

    bq mk --connection --location=US --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE bqml_tutorial

    מחליפים את PROJECT_ID במזהה הפרויקט ב-Cloud de Confiance . הפרמטר --project_id מבטל את ברירת המחדל של הפרויקט.

    כשיוצרים משאב חיבור, מערכת BigQuery יוצרת חשבון שירות ייחודי ומקשרת אותו לחיבור.

    פתרון בעיות: אם מופיעה שגיאת החיבור הבאה, צריך לעדכן את Google Cloud SDK:

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. מאחזרים ומעתיקים את מזהה חשבון השירות כדי להשתמש בו בשלב מאוחר יותר:

    bq show --connection PROJECT_ID.us.bqml_tutorial

    הפלט אמור להיראות כך:

    name                          properties
    1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.s3ns-system.iam.gserviceaccount.com"}
    

הגדרת גישה לחיבור

נותנים לחשבון השירות של הקישור למשאבים ב-Cloud את התפקיד 'אדמין של אובייקטים באחסון'. צריך להקצות את התפקיד הזה באותו פרויקט שבו העליתם את קובצי התמונות.

כדי להקצות את התפקיד:

  1. עוברים לדף IAM & Admin.

    כניסה לדף IAM & Admin

  2. לוחצים על Grant Access.

  3. בשדה New principals, מזינים את מזהה חשבון השירות של חיבור משאב הענן שהעתקתם קודם.

  4. בשדה Select a role, בוחרים באפשרות Cloud Storage ואז באפשרות Storage object admin.

  5. לוחצים על Save.

יצירת טבלת האובייקטים

כדי ליצור טבלת אובייקטים בשם goldfish_image_table באמצעות תמונת הדג הזהב שהעליתם ל-Cloud Storage, מבצעים את השלבים הבאים:

המסוף

  1. עוברים לדף BigQuery Studio.

    כניסה ל-BigQuery Studio

  2. מזינים את השאילתה הבאה בעורך השאילתות כדי ליצור את טבלת האובייקטים.

    CREATE EXTERNAL TABLE `bqml_tutorial.goldfish_image_table`
    WITH CONNECTION `us.bqml_tutorial`
    OPTIONS(
    object_metadata = 'SIMPLE',
    uris = ['gs://bqml_images/IMAGE_NAME'],
    max_staleness = INTERVAL 1 DAY,
    metadata_cache_mode = 'AUTOMATIC');

    מחליפים את IMAGE_NAME בשם של קובץ התמונה – לדוגמה, goldfish.jpg.

    בסיום הפעולה, תופיע הודעה כמו This statement created a new table named goldfish_image_table.

BQ

  1. יוצרים את טבלת האובייקטים על ידי הזנת ההצהרה הבאה CREATE EXTERNAL TABLE

    bq query --use_legacy_sql=false \
    "CREATE EXTERNAL TABLE `bqml_tutorial.goldfish_image_table`
    WITH CONNECTION `us.bqml_tutorial`
    OPTIONS(
    object_metadata = 'SIMPLE',
    uris = ['gs://bqml_images/IMAGE_NAME'],
    max_staleness = INTERVAL 1 DAY,
    metadata_cache_mode = 'AUTOMATIC')"

    מחליפים את IMAGE_NAME בשם של קובץ התמונה – לדוגמה, goldfish.jpg.

  2. אחרי שיוצרים את טבלת האובייקטים, מוודאים שהיא מופיעה במערך הנתונים.

    bq ls bqml_tutorial

    הפלט אמור להיראות כך:

    tableId               Type
    --------------------- --------
    goldfish_image_table  EXTERNAL

מידע נוסף זמין במאמר יצירת טבלאות אובייקטים.

ביצוע חיזויים באמצעות מודל ONNX מיובא

משתמשים בשאילתה הבאה שמכילה את הפונקציה ML.PREDICT כדי ליצור תחזיות מנתוני תמונות בטבלת אובייקטים של קלט goldfish_image_table. השאילתה הזו מחזירה את תווית הסיווג החזויה של תמונת הקלט על סמך מילון התוויות של ImageNet.

בשילוב עם השאילתה, צריך להשתמש בפונקציה ML.DECODE_IMAGE כדי לפענח את נתוני התמונה, כך ש-ML.PREDICT יוכל לפרש אותם. הפונקציה ML.RESIZE_IMAGE נקראת כדי לשנות את גודל התמונה כך שתתאים לגודל הקלט של המודל (224*224).

למידע נוסף על הפעלת הסקה בטבלאות של אובייקטים בתמונות, אפשר לעיין במאמר הפעלת הסקה בטבלאות של אובייקטים בתמונות.

כדי ליצור תחזיות מנתוני התמונות, פועלים לפי השלבים הבאים.

המסוף

  1. עוברים לדף BigQuery Studio.

    כניסה ל-BigQuery Studio

  2. מזינים את השאילתה ML.PREDICT הבאה בעורך השאילתות.

     SELECT
       class_label
     FROM
       ML.PREDICT(MODEL bqml_tutorial.imported_onnx_model,
         (
         SELECT
           ML.RESIZE_IMAGE(ML.DECODE_IMAGE(DATA),
             224,
             224,
             FALSE) AS input
         FROM
           bqml_tutorial.goldfish_image_table))
     

    תוצאות השאילתה אמורות להיראות כך:

    התוצאות של השאילתה ML.PREDICT

BQ

מזינים את הפקודה bq query הבאה:

bq query --use_legacy_sql=false \
'SELECT
  class_label
FROM
  ML.PREDICT(MODEL `bqml_tutorial.imported_onnx_model`,
    (
    SELECT
      ML.RESIZE_IMAGE(ML.DECODE_IMAGE(DATA),
        224,
        224,
        FALSE) AS input
    FROM
      bqml_tutorial.goldfish_image_table))'

הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.

מחיקת הפרויקט

המסוף

  1. במסוף Cloud de Confiance , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

gcloud

    כדי למחוק פרויקט Cloud de Confiance :

    gcloud projects delete PROJECT_ID

מחיקת משאבים בודדים

לחלופין, כדי להסיר את המשאבים הספציפיים שבהם השתמשתם במדריך הזה, מבצעים את הפעולות הבאות:

  1. מחיקת המודל המיובא.

  2. (אופציונלי) מחיקת מערך הנתונים.

  3. מחיקת הקישור למשאבים ב-Cloud.

  4. מחיקת הקטגוריה של Cloud Storage.

המאמרים הבאים