Vorhersagen mit PyTorch-Modellen im ONNX-Format treffen
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:
- Die Google Cloud Console
- Der Befehl
bq query
im bq-Befehlszeilentool - BigQuery API
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.
Ziele
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
Öffnen Sie in der Google Cloud Console die Seite „BigQuery“.
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 Namenimported_onnx_model
.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 zu erkennen.
Wenn Sie das neue Modell im Feld Ressourcen auswählen, werden Informationen zum Modell unter dem Abfrageeditor angezeigt.
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
Öffnen Sie in der Google Cloud Console die Seite „BigQuery“.
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 Datasetexample_dataset
im aktuellen Projekt, um Vorhersagen auf Basis von Bilddaten in der Eingabeobjekttabellegoldfish_image_table
zu treffen. Die FunktionML.DECODE_IMAGE
ist erforderlich, um die Bilddaten zu decodieren, damit sie vonML.PREDICT
interpretiert werden können. Außerdem wird die FunktionML.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.
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
- Weitere Informationen zum Importieren von ONNX-Modellen finden Sie unter
CREATE MODEL
-Anweisung für ONNX-Modelle. - Weitere Informationen zu verfügbaren ONNX-Convertern und Anleitungen finden Sie unter In ONNX-Format konvertieren.
- Einführung in BigQuery ML
- Informationen zur Verwendung von BigQuery ML finden Sie unter Modelle für maschinelles Lernen in BigQuery ML erstellen.
- Weitere Informationen zum Arbeiten mit Modellen finden Sie in folgenden Ressourcen: