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

במדריך הזה נסביר איך לייבא מודל Open Neural Network Exchange‏ (ONNX) שאומן באמצעות scikit-learn. מייבאים את המודל למערך נתונים ב-BigQuery ומשתמשים בו כדי ליצור תחזיות באמצעות שאילתת SQL.

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

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

מטרות

  • יצירה ואימון של מודל באמצעות scikit-learn.
  • ממירים את המודל לפורמט ONNX באמצעות sklearn-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. מפעילים את BigQuery API ואת Cloud Storage API.

    תפקידים שנדרשים להפעלת ממשקי 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

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

אימון מודל סיווג באמצעות scikit-learn

אפשר להשתמש בקוד לדוגמה הבא כדי ליצור צינור עיבוד נתונים של scikit-learn ולאמן אותו על מערך הנתונים Iris. הוראות להתקנה ולשימוש ב-scikit-learn מופיעות במדריך ההתקנה של scikit-learn.

import numpy
from sklearn.datasets import load_iris
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier

data = load_iris()
X = data.data[:, :4]
y = data.target

ind = numpy.arange(X.shape[0])
numpy.random.shuffle(ind)
X = X[ind, :].copy()
y = y[ind].copy()

pipe = Pipeline([('scaler', StandardScaler()),
                ('clr', RandomForestClassifier())])
pipe.fit(X, y)

המרת הצינור למודל ONNX

משתמשים בקוד לדוגמה הבא ב-sklearn-onnx כדי להמיר את צינור העיבוד של scikit-learn למודל ONNX בשם pipeline_rf.onnx.

from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType

# Disable zipmap as it is not supported in BigQuery ML.
options = {id(pipe): {'zipmap': False}}

# Define input features. scikit-learn does not store information about the
# training dataset. It is not always possible to retrieve the number of features
# or their types. That's why the function needs another argument called initial_types.
initial_types = [
   ('sepal_length', FloatTensorType([None, 1])),
   ('sepal_width', FloatTensorType([None, 1])),
   ('petal_length', FloatTensorType([None, 1])),
   ('petal_width', FloatTensorType([None, 1])),
]

# Convert the model.
model_onnx = convert_sklearn(
   pipe, 'pipeline_rf', initial_types=initial_types, options=options
)

# And save.
with open('pipeline_rf.onnx', 'wb') as f:
 f.write(model_onnx.SerializeToString())

העלאת מודל 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"
  }
}

BigQuery DataFrames

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של BigQuery DataFrames במדריך לתחילת העבודה עם BigQuery באמצעות BigQuery DataFrames. מידע נוסף מופיע במאמרי העזרה בנושא BigQuery DataFrames.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת ADC לסביבת פיתוח מקומית.

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

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

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

כדי לייבא את מודל ONNX למערך הנתונים, בוחרים באחת מהאפשרויות הבאות:

המסוף

  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/pipeline_rf.onnx.

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

    המודל החדש מופיע בחלונית משאבים. מודלים מסומנים בסמל המודל: סמל המודל בחלונית המשאבים אם בוחרים את המודל החדש בחלונית 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/pipeline_rf.onnx.

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

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

    bq ls -m bqml_tutorial

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

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

BigQuery DataFrames

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של BigQuery DataFrames במדריך לתחילת העבודה עם BigQuery באמצעות BigQuery DataFrames. מידע נוסף מופיע במאמרי העזרה בנושא BigQuery DataFrames.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת ADC לסביבת פיתוח מקומית.

מייבאים את המודל באמצעות האובייקט ONNXModel.

import bigframes
from bigframes.ml.imported import ONNXModel

bigframes.options.bigquery.project = PROJECT_ID
# You can change the location to one of the valid locations: https://cloud.google.com/bigquery/docs/locations#supported_locations
bigframes.options.bigquery.location = "US"

imported_onnx_model = ONNXModel(
    model_path="gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx"
)

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

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

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

השאילתה בשלבים הבאים משתמשת ב-imported_onnx_model כדי ליצור תחזיות באמצעות נתוני קלט מהטבלה iris במערך הנתונים הציבורי ml_datasets. מודל ONNX מצפה לארבעה ערכים של FLOAT כקלט:

  • sepal_length
  • sepal_width
  • petal_length
  • petal_width

הנתונים האלה זהים לנתוני הקלט של initial_types שהוגדרו כשהמרתם את המודל לפורמט ONNX.

הפלט כולל את העמודות label ו-probabilities, ואת העמודות מטבלת הקלט. ‫label מייצג את תווית הסיווג החזויה. ‫probabilities הוא מערך של הסתברויות שמייצג את ההסתברויות לכל מחלקה.

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

המסוף

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

    כניסה ל-BigQuery Studio

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

    SELECT *
      FROM ML.PREDICT(MODEL `bqml_tutorial.imported_onnx_model`,
        (
        SELECT * FROM `bigquery-public-data.ml_datasets.iris`
        )
    )

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

    הפלט של השאילתה ML.PREDICT

BQ

מריצים את השאילתה שמשתמשת בשדה ML.PREDICT.

bq query --use_legacy_sql=false \
'SELECT *
FROM ML.PREDICT(
MODEL `example_dataset.imported_onnx_model`,
(SELECT * FROM `bigquery-public-data.ml_datasets.iris`))'

BigQuery DataFrames

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של BigQuery DataFrames במדריך לתחילת העבודה עם BigQuery באמצעות BigQuery DataFrames. מידע נוסף מופיע במאמרי העזרה בנושא BigQuery DataFrames.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת ADC לסביבת פיתוח מקומית.

כדי להפעיל את מודל ONNX, משתמשים בפונקציה predict.

import bigframes.pandas as bpd

df = bpd.read_gbq("bigquery-public-data.ml_datasets.iris")
predictions = imported_onnx_model.predict(df)
predictions.peek(5)

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

הפלט של פונקציית החיזוי

הסרת המשאבים

כדי להימנע מחיובים בחשבון 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. אופציונלי: מחיקת מערך הנתונים.

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