Vorhersagen mit scikit-learn-Modellen im ONNX-Format treffen

Überblick

Open Neural Network Exchange (ONNX) bietet ein einheitliches Format für die Darstellung von Frameworks für maschinelles Lernen. Die BigQuery ML-Unterstützung für ONNX bietet folgende Möglichkeiten:

  • Trainieren eines Modells mit Ihrem bevorzugten Framework.
  • Konvertieren des Modells in das ONNX-Modellformat. Weitere Informationen finden Sie unter In ONNX-Format konvertieren.
  • ONNX-Modell in BigQuery importieren und Vorhersagen mit BigQuery ML treffen.

In dieser Anleitung erfahren Sie, wie Sie ONNX-Modelle, die mit scikit-learn trainiert wurden, in ein BigQuery-Dataset importieren und damit Vorhersagen aus einer SQL-Abfrage treffen. Sie können ONNX-Modelle mit diesen Benutzeroberflächen importieren:

Weitere Informationen zum Importieren von ONNX-Modellen in BigQuery, einschließlich Format- und Speicheranforderungen, finden Sie unter Anweisung CREATE MODEL zum Importieren von ONNX-Modellen.

Lernziele

In dieser Anleitung wird Folgendes beschrieben:

  • Modelle mit scikit-learn erstellen und trainieren
  • Modelle mit sklearn-onnx in das ONNX-Format konvertieren.
  • ONNX-Modelle in BigQuery importieren und Vorhersagen treffen.

Klassifizierungsmodell mit scikit-learn trainieren

Erstellen und trainieren Sie eine scikit-learn-Pipeline für das Dataset Iris:

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)

Modell in das ONNX-Format konvertieren und speichern

Verwenden Sie sklearn-onnx, um die scikit-learn-Pipeline in ein ONNX-Modell mit dem Namen pipeline_rf.onnx zu konvertieren:

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-Modell in Cloud Storage hochladen

Erstellen Sie einen Cloud Storage-Bucket zum Speichern der ONNX-Modelldatei und laden Sie dann die gespeicherte ONNX-Modelldatei in den Cloud Storage-Bucket hoch. Weitere Informationen finden Sie unter Objekte aus einem Dateisystem hochladen.

ONNX-Modell in BigQuery importieren

Bei diesem Schritt wird davon ausgegangen, dass Sie das ONNX-Modell in den Cloud Storage-Bucket hochgeladen haben. Ein Beispielmodell wird unter gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx gespeichert.

Console

  1. Öffnen Sie in der Google Cloud Console die Seite „BigQuery“.

    Zur Seite "BigQuery"

  2. Geben Sie im Abfrageeditor die Anweisung CREATE MODEL etwa so ein:

     CREATE OR REPLACE MODEL `mydataset.mymodel`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='gs://bucket/path/to/onnx_model/*')
    

    Beispiel:

     CREATE OR REPLACE MODEL `example_dataset.imported_onnx_model`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx')
    

    Die vorherige Abfrage importiert das ONNX-Modell unter gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx als BigQuery-Modell mit dem Namen imported_onnx_model.

  3. Ihr neues Modell sollte jetzt im Feld Ressourcen angezeigt werden. Wenn Sie die einzelnen Datasets in einem Projekt maximieren, werden die Modelle zusammen mit den anderen BigQuery-Ressourcen in den Datasets aufgelistet. Modelle sind am Modellsymbol Modellsymbol zu erkennen.

  4. Wenn Sie das neue Modell im Feld Ressourcen auswählen, werden Informationen zum Modell unter dem Abfrageeditor angezeigt.

    Informationen zum Onnx-Modell

bq

Führen Sie zum Importieren eines ONNX-Modells aus Cloud Storage eine Batchabfrage aus. Dazu nutzen Sie einen Befehl wie den folgenden:

bq query \
--use_legacy_sql=false \
"CREATE MODEL
  `mydataset.mymodel`
OPTIONS
  (MODEL_TYPE='ONNX',
   MODEL_PATH='gs://bucket/path/to/onnx_model/*')"

Beispiel:

bq query --use_legacy_sql=false \
"CREATE OR REPLACE MODEL
  `example_dataset.imported_onnx_model`
OPTIONS
  (MODEL_TYPE='ONNX',
   MODEL_PATH='gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx')"

Nach dem Import sollte das Modell in der Ausgabe von bq ls [dataset_name] angezeigt werden:

$ bq ls example_dataset

       tableId          Type    Labels   Time Partitioning
 --------------------- ------- -------- -------------------
  imported_onnx_model   MODEL

API

Fügen Sie einen neuen Job ein und geben Sie das Attribut jobs#configuration.query wie in diesem Anfragetext an:

{
  "query": "CREATE MODEL project_id:mydataset.mymodel OPTIONS(MODEL_TYPE='ONNX' MODEL_PATH='gs://bucket/path/to/onnx_model/*')"
}

Vorhersagen mit dem importierten ONNX-Modell treffen

Console

  1. Öffnen Sie in der Google Cloud Console die Seite „BigQuery“.

    Zur Seite "BigQuery"

  2. Geben Sie im Abfrageeditor mit ML.PREDICT eine Abfrage wie folgende ein.

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

    Die vorherige Abfrage nutzt das Modell namens imported_onnx_model im Dataset example_dataset im aktuellen Projekt, um Vorhersagen auf Basis der Eingabedaten in der öffentlichen Tabelle iris des Datasets ml_datasets im Projekt bigquery-public-data zu treffen. In diesem Fall erwartet das ONNX-Modell vier Float-Eingaben: sepal_length, sepal_width, petal_length und petal_width, die den im Schritt 2 definierten initial_types entsprechen, also die Unterabfrage SELECT der gesamten bigquery-public-data-Tabelle, die diese vier Eingabespalten enthält.

    Das Modell gibt die Spalten label und probabilities sowie die Spalten aus der Eingabetabelle aus.

    • label steht für das vorhergesagte Klassenlabel.
    • probabilities ist ein Array von Wahrscheinlichkeiten, die Wahrscheinlichkeiten für jede Klasse darstellen.

    Das Ergebnis sieht etwa so aus:

    Abfrageergebnisse

bq

Geben Sie einen Befehl wie den folgenden unter Nutzung des importierten ONNX-Modells my_model ein, um Vorhersagen aus Eingabedaten der Tabelle input_data zu treffen:

bq query \
--use_legacy_sql=false \
'SELECT *
 FROM ML.PREDICT(
   MODEL `my_project.my_dataset.my_model`,
   (SELECT * FROM input_data))'

Beispiel:

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

API

Fügen Sie einen neuen Job ein und geben Sie das Attribut jobs#configuration.query wie in diesem Anfragetext an:

{
  "query": "SELECT * FROM ML.PREDICT(MODEL `my_project.my_dataset.my_model`, (SELECT * FROM input_data))"
}

Nächste Schritte