Open Neural Network Exchange (ONNX) fornisce un formato uniforme progettato per rappresentare qualsiasi framework di machine learning. Il supporto di BigQuery ML per ONNX ti consente di:
- Addestra un modello utilizzando il tuo framework preferito.
- Converti il modello nel formato ONNX.
- Importa il modello ONNX in BigQuery ed esegui previsioni utilizzando BigQuery ML.
Questo tutorial mostra come importare modelli ONNX addestrati con PyTorch in un set di dati BigQuery e utilizzarli per fare previsioni da una query SQL.
Obiettivi
- Importa un modello preaddestrato utilizzando PyTorch.
- Converti il modello nel formato ONNX utilizzando torch.onnx.
- Utilizza l'istruzione
CREATE MODEL
per importare il modello ONNX in BigQuery. - Utilizza la funzione
ML.PREDICT
per fare previsioni con il modello ONNX importato.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per ulteriori informazioni, vedi Pulizia.
Prima di iniziare
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Cloud Storage APIs.
- Assicurati di disporre delle autorizzazioni necessarie per eseguire le attività descritte in questo documento.
-
Make sure that you have the following role or roles on the project:
- BigQuery Studio Admin (
roles/bigquery.studioAdmin
) - BigQuery Connection Admin (
roles/bigquery.connectionAdmin
) - Storage Admin
(roles/storage.admin)
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
Vai a IAM - Seleziona il progetto.
- Fai clic su Concedi l'accesso.
-
Nel campo Nuove entità, inserisci il tuo identificatore utente. In genere si tratta dell'indirizzo email di un Account Google.
- Nell'elenco Seleziona un ruolo, seleziona un ruolo.
- Per concedere altri ruoli, fai clic su Aggiungi un altro ruolo e aggiungi ogni ruolo aggiuntivo.
- Fai clic su Salva.
- Crea un bucket Cloud Storage per archiviare il modello.
- Carica il modello ONNX nel bucket Cloud Storage.
Nella console Google Cloud , vai alla pagina BigQuery.
Nel riquadro Explorer, fai clic sul nome del progetto.
Fai clic su
Visualizza azioni > Crea set di dati.Nella pagina Crea set di dati:
In ID set di dati, inserisci
bqml_tutorial
.Per Tipo di località, seleziona Multi-regione e poi Stati Uniti (più regioni negli Stati Uniti).
Lascia invariate le restanti impostazioni predefinite e fai clic su Crea set di dati.
Crea un set di dati denominato
bqml_tutorial
con la località dei dati impostata suUS
e una descrizione diBigQuery ML tutorial dataset
:bq --location=US mk -d \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
Anziché utilizzare il flag
--dataset
, il comando utilizza la scorciatoia-d
. Se ometti-d
e--dataset
, il comando crea per impostazione predefinita un dataset.Verifica che il set di dati sia stato creato:
bq ls
Nella console Google Cloud , vai alla pagina BigQuery Studio.
Nell'editor di query, inserisci la seguente istruzione
CREATE MODEL
.CREATE OR REPLACE MODEL `bqml_tutorial.imported_onnx_model` OPTIONS (MODEL_TYPE='ONNX', MODEL_PATH='BUCKET_PATH')
Sostituisci
BUCKET_PATH
con il percorso del modello che hai caricato su Cloud Storage. Se utilizzi il modello di esempio, sostituisciBUCKET_PATH
con il seguente valore:gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx
.Al termine dell'operazione, viene visualizzato un messaggio simile al seguente:
Successfully created model named imported_onnx_model
.Il nuovo modello viene visualizzato nel riquadro Risorse. I modelli sono indicati dall'icona del modello:
Se selezioni il nuovo modello nel riquadro Risorse, le informazioni sul modello vengono visualizzate accanto all'editor query.
Importa il modello ONNX da Cloud Storage inserendo la seguente istruzione
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')"
Sostituisci
BUCKET_PATH
con il percorso del modello che hai caricato su Cloud Storage. Se utilizzi il modello di esempio, sostituisciBUCKET_PATH
con questo valore:gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx
.Dopo aver importato il modello, verifica che venga visualizzato nel set di dati.
bq ls bqml_tutorial
L'output è simile al seguente:
tableId Type --------------------- ------- imported_onnx_model MODEL
- Crea un bucket Cloud Storage e carica un'immagine di un pesce rosso.
- Crea una connessione risorsa Cloud utilizzata per accedere alla tabella degli oggetti.
- Concedi l'accesso al account di servizio della connessione alle risorse.
- Nella console Google Cloud , vai alla pagina Bucket in Cloud Storage.
Fai clic su
Crea.Nella pagina Crea un bucket, inserisci le informazioni del bucket.
Nella sezione Inizia, segui questi passaggi:
Nella casella, inserisci
bqml_images
.Fai clic su Continua.
Nella sezione Scegli dove archiviare i tuoi dati, segui questi passaggi:
Per Tipo di località, seleziona Più regioni.
Dal menu del tipo di località, seleziona Stati Uniti (più regioni negli Stati Uniti).
Fai clic su Continua.
Nella sezione Scegli una classe di archiviazione per i tuoi dati:
Seleziona Impostare una classe predefinita.
Seleziona Standard.
Fai clic su Continua.
Nelle sezioni rimanenti, lascia i valori predefiniti.
Fai clic su Crea.
- Nella console Google Cloud , vai alla pagina Bucket in Cloud Storage.
Nell'elenco dei bucket, fai clic su
bqml_images
.Nella scheda Oggetti del bucket, esegui una delle seguenti operazioni:
Trascina il file dal desktop o dal file manager nel riquadro principale della Google Cloud console.
Fai clic su Carica > Carica file, seleziona il file immagine che vuoi caricare nella finestra di dialogo che viene visualizzata, poi fai clic su Apri.
OBJECT_LOCATION
: il percorso locale del file immagine. Ad esempio,Desktop/goldfish.jpg
.IMAGE_NAME
: il nome dell'immagine. Ad esempio,goldfish.jpg
.Vai alla pagina BigQuery Studio.
Nel riquadro Explorer, fai clic su
Aggiungi dati.Si apre la finestra di dialogo Aggiungi dati.
Nel riquadro Filtra per, seleziona Database nella sezione Tipo di origine dati.
In alternativa, nel campo Cerca origini dati, puoi inserire
Vertex AI
.Nella sezione Origini dati in evidenza, fai clic su Vertex AI.
Fai clic sulla scheda della soluzione Vertex AI Models: BigQuery Federation.
Nell'elenco Tipo di connessione, seleziona Modelli remoti di Vertex AI, funzioni remote e BigLake (risorsa Cloud).
Nel campo ID connessione, inserisci
bqml_tutorial
.Verifica che sia selezionata l'opzione Multi-regione - Stati Uniti.
Fai clic su Crea connessione.
Nella parte inferiore della finestra, fai clic su Vai alla connessione. In alternativa, nel riquadro Explorer, espandi Connessioni esterne e poi fai clic su
us.bqml_tutorial
.Nel riquadro Informazioni sulla connessione, copia l'ID dell'account di servizio. Hai bisogno di questo ID quando configuri le autorizzazioni per la connessione. Quando crei una risorsa di connessione, BigQuery crea unaccount di serviziot di sistema univoco e lo associa alla connessione.
Creare una connessione:
bq mk --connection --location=US --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE bqml_tutorial
Sostituisci
PROJECT_ID
con l'Google Cloud ID progetto. Il parametro--project_id
esegue l'override del progetto predefinito.Quando crei una risorsa di connessione, BigQuery crea un account di serviziot di sistema univoco e lo associa alla connessione.
Risoluzione dei problemi: se viene visualizzato il seguente errore di connessione, aggiorna Google Cloud SDK:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Recupera e copia l'ID account di servizio da utilizzare in un passaggio successivo:
bq show --connection PROJECT_ID.us.bqml_tutorial
L'output è simile al seguente:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Vai alla pagina IAM e amministrazione.
Fai clic su
Concedi l'accesso.Nel campo Nuove entità, inserisci l'ID account di servizio della connessione alla risorsa cloud che hai copiato in precedenza.
Nel campo Seleziona un ruolo, scegli Cloud Storage e poi seleziona Amministratore oggetti Storage.
Fai clic su Salva.
Vai alla pagina BigQuery Studio.
Nell'editor di query, inserisci questa query per creare la tabella degli oggetti.
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');
Sostituisci
IMAGE_NAME
con il nome del file dell'immagine, ad esempiogoldfish.jpg
.Al termine dell'operazione, viene visualizzato un messaggio come
This statement created a new table named goldfish_image_table
.Crea la tabella degli oggetti inserendo la seguente istruzione
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')"
Sostituisci
IMAGE_NAME
con il nome del file dell'immagine, ad esempiogoldfish.jpg
.Dopo aver creato la tabella degli oggetti, verifica che venga visualizzata nel set di dati.
bq ls bqml_tutorial
L'output è simile al seguente:
tableId Type --------------------- -------- goldfish_image_table EXTERNAL
Vai alla pagina BigQuery Studio.
Nell'editor di query, inserisci la seguente query
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))I risultati della query sono simili ai seguenti:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
- Per ulteriori informazioni sull'importazione di modelli ONNX, consulta
L'istruzione
CREATE MODEL
per i modelli ONNX. - Per ulteriori informazioni sui convertitori ONNX e sui tutorial disponibili, consulta Conversione nel formato ONNX.
- Per una panoramica di BigQuery ML, consulta Introduzione a BigQuery ML.
- Per iniziare a utilizzare BigQuery ML, consulta Creare modelli di machine learning in BigQuery ML.
Per saperne di più sulle autorizzazioni IAM in BigQuery, consulta Autorizzazioni IAM.
(Facoltativo) Addestra un modello e convertilo nel formato ONNX
I seguenti esempi di codice mostrano come importare un modello di classificazione preaddestrato in PyTorch e come convertire il modello risultante nel formato ONNX. Questo tutorial utilizza un modello di esempio predefinito archiviato in
gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx
. Non devi completare questi passaggi se utilizzi il modello di esempio.Crea un modello di visione artificiale PyTorch per la classificazione delle immagini
Utilizza il seguente esempio di codice per importare un modello resnet18 preaddestrato PyTorch che accetta i dati delle immagini decodificati restituiti dalle funzioni BigQuery ML
ML.DECODE_IMAGE
eML.RESIZE_IMAGE
.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() )
Convertire il modello in formato ONNX
Utilizza il seguente esempio per esportare il modello di visione PyTorch utilizzando torch.onnx. Il file ONNX esportato si chiama
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
Carica il modello ONNX su Cloud Storage
Dopo aver salvato il modello:
Crea un set di dati
Crea un set di dati BigQuery per archiviare il tuo modello ML.
Console
bq
Per creare un nuovo set di dati, utilizza il comando
bq mk
con il flag--location
. Per un elenco completo dei possibili parametri, consulta la documentazione di riferimento del comandobq mk --dataset
.API
Chiama il metodo
datasets.insert
con una risorsa dataset definita.{ "datasetReference": { "datasetId": "bqml_tutorial" } }
BigQuery DataFrames
Prima di provare questo esempio, segui le istruzioni di configurazione di BigQuery DataFrames nella guida rapida di BigQuery che utilizza BigQuery DataFrames. Per ulteriori informazioni, consulta la documentazione di riferimento di BigQuery DataFrames.
Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per maggiori informazioni, vedi Configurare ADC per un ambiente di sviluppo locale.
Importa il modello ONNX in BigQuery
I seguenti passaggi mostrano come importare il modello ONNX di esempio da Cloud Storage nel tuo set di dati utilizzando un'istruzione
CREATE MODEL
.Console
bq
Per ulteriori informazioni sull'importazione di modelli ONNX in BigQuery, inclusi i requisiti di formato e archiviazione, consulta l'istruzione
CREATE MODEL
per l'importazione di modelli ONNX.Crea una tabella degli oggetti in BigQuery per analizzare i dati delle immagini
Una tabella di oggetti è una tabella di sola lettura su oggetti di dati non strutturati che si trovano in Cloud Storage. Le tabelle degli oggetti consentono di analizzare i dati non strutturati da BigQuery.
In questo tutorial, utilizzi la funzione
ML.PREDICT
per restituire l'etichetta di classe prevista di un'immagine di input archiviata in un bucket Cloud Storage.Per creare la tabella degli oggetti, devi:
Crea un bucket e carica un'immagine.
Segui questi passaggi per creare un bucket Cloud Storage e caricare un'immagine di un pesce rosso.
Console
Riga di comando
Inserisci questo comando
gcloud storage buckets create
:gcloud storage buckets create gs://bqml_images --location=us
Se la richiesta riesce, il comando restituisce il seguente messaggio:
Creating gs://bqml_images/...
Carica un'immagine nel bucket Cloud Storage
Dopo aver creato il bucket, scarica un'immagine di un pesce rosso e caricala nel bucket Cloud Storage.
Per caricare l'immagine, completa i seguenti passaggi:
Console
Riga di comando
Inserisci questo comando
gcloud storage cp
:gcloud storage cp OBJECT_LOCATION gs://bqml_images/IMAGE_NAME
Sostituisci quanto segue:
Se l'operazione ha esito positivo, la risposta è simile alla seguente:
Completed files 1/1 | 164.3kiB/164.3kiB
Crea una connessione a una risorsa cloud BigQuery
Devi disporre di una connessione di risorsa Cloud per connetterti alla tabella degli oggetti che creerai più avanti in questo tutorial.
Le connessioni alle risorse cloud consentono di eseguire query sui dati archiviati al di fuori di BigQuery in servizi come Cloud Storage o Spanner oppure in origini di terze parti come AWS o Azure. Google Cloud Queste connessioni esterne utilizzano l'API BigQuery Connection.
Segui questi passaggi per creare la connessione alla risorsa Cloud.
Console
bq
Configurare l'accesso alla connessione
Concedi il ruolo Amministratore oggetti Storage al service account della connessione alla risorsa cloud. Devi concedere questo ruolo nello stesso progetto in cui hai creato l'endpoint del modello remoto.
Per concedere il ruolo, segui questi passaggi:
Creare la tabella degli oggetti
Segui questi passaggi per creare una tabella di oggetti denominata
goldfish_image_table
utilizzando l'immagine del pesce rosso che hai caricato in Cloud Storage.Console
bq
Per saperne di più, vedi Creare tabelle di oggetti.
Fare previsioni con il modello ONNX importato
Utilizzi la seguente query che contiene la funzione
ML.PREDICT
per fare previsioni dai dati immagine nella tabella degli oggetti di inputgoldfish_image_table
. Questa query restituisce l'etichetta di classe prevista dell'immagine di input in base al dizionario delle etichette ImageNet.Nella query, la funzione
ML.DECODE_IMAGE
è necessaria per decodificare i dati dell'immagine in modo che possano essere interpretati daML.PREDICT
. La funzioneML.RESIZE_IMAGE
viene chiamata per ridimensionare l'immagine in modo che si adatti alle dimensioni dell'input del modello (224 x 224).Per saperne di più sull'esecuzione dell'inferenza sulle tabelle degli oggetti immagine, consulta Esegui l'inferenza sulle tabelle degli oggetti immagine.
Per fare previsioni dai dati delle immagini:
Console
bq
Inserisci questo comando
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))'
Esegui la pulizia
Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina il progetto
Console
gcloud
Elimina singole risorse
In alternativa, per rimuovere le singole risorse utilizzate in questo tutorial:
Passaggi successivi
- BigQuery Studio Admin (
Ruoli obbligatori
Se crei un nuovo progetto, ne sei il proprietario e ti vengono concesse tutte le autorizzazioni Identity and Access Management (IAM) necessarie per completare questo tutorial.
Se utilizzi un progetto esistente, procedi nel seguente modo.