Vorhersagen mit PyTorch-Modellen im ONNX-Format treffen

Übersicht

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 PyTorch 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 PyTorch erstellen und trainieren.
  • Modelle mit torch.onnx in das ONNX-Format konvertieren.
  • ONNX-Modelle in BigQuery importieren und Vorhersagen treffen.

PyTorch-Visionsmodell für die Bildklassifizierung erstellen

Importieren Sie ein vortrainiertes PyTorch resnet18, das decodierte Bilddaten akzeptiert, die von den BigQuery ML-Funktionen ML.DECODE_IMAGE und ML.RESIZE_IMAGE zurückgegeben werden.

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()
)

Modell in das ONNX-Format konvertieren und speichern

Verwenden Sie torch.onnx, um das PyTorch-Vision-Modell in eine ONNX-Datei mit dem Namen resnet18.onnx zu exportieren.

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-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/resnet18.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/resnet18.onnx')
    

    Die vorherige Abfrage importiert das ONNX-Modell unter gs://cloud-samples-data/bigquery/ml/onnx/resnet18.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/resnet18.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/*')"
}

Objekttabelle in BigQuery für den Zugriff auf Bilddaten erstellen

Für den Zugriff auf unstrukturierte Daten in BigQuery müssen Sie eine Objekttabelle erstellen. Eine ausführliche Anleitung finden Sie unter Objekttabellen erstellen.

Erstellen Sie eine Objekttabelle mit dem Namen goldfish_image_table für ein Bild eines Goldfischs, das unter gs://mybucket/goldfish.jpg gespeichert ist.

CREATE EXTERNAL TABLE `example_dataset.goldfish_image_table`
WITH CONNECTION `us.my-connection`
OPTIONS(
  object_metadata = 'SIMPLE',
  uris = ['gs://mybucket/goldfish.jpg'],
  max_staleness = INTERVAL 1 DAY,
  metadata_cache_mode = 'AUTOMATIC');

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
       class_label
     FROM
       ML.PREDICT(MODEL example_dataset.imported_onnx_model,
         (
         SELECT
           ML.RESIZE_IMAGE(ML.DECODE_IMAGE(DATA),
             224,
             224,
             FALSE) AS input
         FROM
           example_dataset.goldfish_image_table) )
     

    Die vorherige Abfrage nutzt das Modell namens imported_onnx_model im Dataset example_dataset im aktuellen Projekt, um Vorhersagen auf Basis von Bilddaten in der Eingabeobjekttabelle goldfish_image_table zu treffen. Die Funktion ML.DECODE_IMAGE ist erforderlich, um die Bilddaten zu decodieren, damit sie von ML.PREDICT interpretiert werden können. Außerdem wird die Funktion ML.RESIZE_IMAGE aufgerufen, um die Größe des Bildes an die Größe der Modelleingabe (224 x 224) anzupassen. Weitere Informationen zum Ausführen von Inferenzen für Bildobjekttabellen finden Sie unter Inferenz für Bildobjekttabellen ausführen.

    Diese Abfrage gibt das vorhergesagte Klassenlabel des Eingabebilds basierend auf dem Wörterbuch ImageNet-Labels 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))'

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