Open Neural Network Exchange (ONNX) fournit un format uniforme conçu pour représenter tous les frameworks de machine learning. La compatibilité de BigQuery ML avec ONNX vous permet de :
- Entraîner un modèle à l'aide du framework de votre choix
- Convertir le modèle au format ONNX
- Importer le modèle ONNX dans BigQuery et effectuer des prédictions à l'aide de BigQuery ML
Ce tutoriel vous explique comment importer des modèles ONNX entraînés avec PyTorch dans un ensemble de données BigQuery et les utiliser pour effectuer des prédictions à partir d'une requête SQL.
Objectifs
- Importez un modèle pré-entraîné à l'aide de PyTorch.
- Convertissez le modèle au format ONNX à l'aide de torch.onnx.
- Utilisez l'instruction
CREATE MODEL
pour importer le modèle ONNX dans BigQuery. - Utilisez la fonction
ML.PREDICT
pour effectuer des prédictions avec le modèle ONNX importé.
Coûts
Dans ce document, vous utilisez les composants facturables de Google Cloudsuivants :
Vous pouvez obtenir une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Une fois que vous avez terminé les tâches décrites dans ce document, supprimez les ressources que vous avez créées pour éviter que des frais vous soient facturés. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
- 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.
- Assurez-vous de disposer des autorisations nécessaires pour effectuer les tâches décrites dans ce document.
-
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.
Accéder à IAM - Sélectionnez le projet.
- Cliquez sur Accorder l'accès.
-
Dans le champ Nouveaux comptes principaux, saisissez votre identifiant utilisateur. Il s'agit généralement de l'adresse e-mail d'un compte Google.
- Dans la liste Sélectionner un rôle, sélectionnez un rôle.
- Pour attribuer des rôles supplémentaires, cliquez sur Ajouter un autre rôle et ajoutez tous les rôles supplémentaires.
- Cliquez sur Enregistrer.
- Créez un bucket Cloud Storage pour stocker le modèle.
- Importez le modèle ONNX dans votre bucket Cloud Storage.
Dans la console Google Cloud , accédez à la page BigQuery.
Dans le volet Explorateur, cliquez sur le nom de votre projet.
Cliquez sur
Afficher les actions > Créer un ensemble de données.Sur la page Créer un ensemble de données, procédez comme suit :
Dans le champ ID de l'ensemble de données, saisissez
bqml_tutorial
.Pour Type d'emplacement, sélectionnez Multirégional, puis sélectionnez US (plusieurs régions aux États-Unis).
Conservez les autres paramètres par défaut, puis cliquez sur Créer un ensemble de données.
Créez un ensemble de données nommé
bqml_tutorial
avec l'emplacement des données défini surUS
et une description deBigQuery ML tutorial dataset
:bq --location=US mk -d \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
Au lieu d'utiliser l'option
--dataset
, la commande utilise le raccourci-d
. Si vous omettez-d
et--dataset
, la commande crée un ensemble de données par défaut.Vérifiez que l'ensemble de données a été créé :
bq ls
Dans la console Google Cloud , accédez à la page BigQuery Studio.
Dans l'éditeur de requête, saisissez l'instruction
CREATE MODEL
suivante.CREATE OR REPLACE MODEL `bqml_tutorial.imported_onnx_model` OPTIONS (MODEL_TYPE='ONNX', MODEL_PATH='BUCKET_PATH')
Remplacez
BUCKET_PATH
par le chemin d'accès au modèle que vous avez importé dans Cloud Storage. Si vous utilisez le modèle d'exemple, remplacezBUCKET_PATH
par la valeur suivante :gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx
.Une fois l'opération terminée, un message semblable à celui-ci s'affiche :
Successfully created model named imported_onnx_model
.Votre nouveau modèle apparaît dans le panneau Ressources. Les modèles sont indiqués par l'icône :
Si vous sélectionnez le nouveau modèle dans le panneau Ressources, les informations relatives au modèle s'affichent à côté de l'éditeur de requête.
Importez le modèle ONNX depuis Cloud Storage en saisissant l'instruction
CREATE MODEL
suivante.bq query --use_legacy_sql=false \ "CREATE OR REPLACE MODEL `bqml_tutorial.imported_onnx_model` OPTIONS (MODEL_TYPE='ONNX', MODEL_PATH='BUCKET_PATH')"
Remplacez
BUCKET_PATH
par le chemin d'accès au modèle que vous avez importé dans Cloud Storage. Si vous utilisez l'exemple de modèle, remplacezBUCKET_PATH
par cette valeur :gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx
.Une fois le modèle importé, vérifiez qu'il apparaît dans l'ensemble de données.
bq ls bqml_tutorial
Le résultat ressemble à ce qui suit :
tableId Type --------------------- ------- imported_onnx_model MODEL
- Créez un bucket Cloud Storage et importez une image de poisson rouge.
- Créez une connexion de ressource Cloud qui permet d'accéder à la table d'objets.
- Accordez l'accès au compte de service de la connexion à la ressource.
- Dans la console Google Cloud , accédez à la page Buckets de Cloud Storage.
Cliquez sur
Créer.Sur la page Créer un bucket, saisissez les informations concernant votre bucket.
Dans la section Premiers pas, procédez comme suit :
Dans la zone de texte, saisissez
bqml_images
.Cliquez sur Continuer.
Dans la section Choisir l'emplacement de stockage de vos données, procédez comme suit :
Dans le champ Type d'emplacement, sélectionnez Multirégional.
Dans le menu du type d'emplacement, sélectionnez US (plusieurs régions aux États-Unis).
Cliquez sur Continuer.
Dans la section Choisir une classe de stockage pour vos données :
Sélectionnez Définir une classe par défaut.
Sélectionnez Standard.
Cliquez sur Continuer.
Conservez les valeurs par défaut dans les autres sections.
Cliquez sur Créer.
- Dans la console Google Cloud , accédez à la page Buckets de Cloud Storage.
Dans la liste des buckets, cliquez sur
bqml_images
.Dans l'onglet Objets du bucket, effectuez l'une des actions suivantes :
Faites glisser le fichier de votre bureau ou de votre gestionnaire de fichiers vers le volet principal de la console Google Cloud .
Cliquez sur Importer > Importer des fichiers, sélectionnez le fichier image que vous souhaitez importer dans la boîte de dialogue qui s'affiche, puis cliquez sur Ouvrir.
OBJECT_LOCATION
: chemin d'accès local à votre fichier image. Exemple :Desktop/goldfish.jpg
IMAGE_NAME
: nom de l'image. Exemple :goldfish.jpg
.Accédez à la page BigQuery Studio.
Dans le volet Explorateur, cliquez sur
Ajouter des données.La boîte de dialogue Ajouter des données s'ouvre.
Dans le volet Filtrer par, dans la section Type de source de données, sélectionnez Bases de données.
Vous pouvez également saisir
Vertex AI
dans le champ Rechercher des sources de données.Dans la section Sources de données recommandées, cliquez sur Vertex AI.
Cliquez sur la fiche solution Modèles Vertex AI : fédération BigQuery.
Dans la liste Type de connexion, sélectionnez Modèles distants Vertex AI, fonctions distantes et BigLake (ressource Cloud).
Dans le champ ID de connexion, saisissez
bqml_tutorial
.Vérifiez que l'option Multirégional – États-Unis est sélectionnée.
Cliquez sur Créer une connexion.
En bas de la fenêtre, cliquez sur Accéder à la connexion. Vous pouvez également, dans le volet Explorateur, développer Connexions externes, puis cliquer sur
us.bqml_tutorial
.Dans le volet Informations de connexion, copiez l'ID du compte de service. Vous aurez besoin de cet ID lorsque vous configurerez les autorisations pour la connexion. Lorsque vous créez une ressource de connexion, BigQuery crée un compte de service système unique et l'associe à la connexion.
Créez une connexion :
bq mk --connection --location=US --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE bqml_tutorial
Remplacez
PROJECT_ID
par l'ID de votre projetGoogle Cloud . Le paramètre--project_id
remplace le projet par défaut.Lorsque vous créez une ressource de connexion, BigQuery crée un compte de service système unique et l'associe à la connexion.
Dépannage : Si vous obtenez l'erreur de connexion suivante, mettez à jour le Google Cloud SDK :
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Récupérez et copiez l'ID du compte de service pour l'utiliser lors d'une prochaine étape :
bq show --connection PROJECT_ID.us.bqml_tutorial
Le résultat ressemble à ce qui suit :
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Accédez à la page IAM et administration.
Cliquez sur
Accorder l'accès.Dans le champ Nouveaux comptes principaux, saisissez l'ID du compte de service de la connexion de ressource cloud que vous avez copié précédemment.
Dans le champ Sélectionner un rôle, sélectionnez Cloud Storage, puis Administrateur des objets Storage.
Cliquez sur Enregistrer.
Accédez à la page BigQuery Studio.
Dans l'éditeur de requêtes, saisissez cette requête pour créer la table d'objets.
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');
Remplacez
IMAGE_NAME
par le nom du fichier image, par exemplegoldfish.jpg
.Une fois l'opération terminée, un message semblable à
This statement created a new table named goldfish_image_table
s'affiche.Créez la table d'objets en saisissant l'instruction
CREATE EXTERNAL TABLE
suivante.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')"
Remplacez
IMAGE_NAME
par le nom du fichier image, par exemplegoldfish.jpg
.Après avoir créé la table d'objets, vérifiez qu'elle apparaît dans l'ensemble de données.
bq ls bqml_tutorial
Le résultat ressemble à ce qui suit :
tableId Type --------------------- -------- goldfish_image_table EXTERNAL
Accédez à la page BigQuery Studio.
Dans l'éditeur de requête, saisissez la requête
ML.PREDICT
suivante.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))Les résultats de la requête sont semblables à ceux-ci :
- 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.
- Pour en savoir plus sur l'importation de modèles ONNX, consultez la page Instruction
CREATE MODEL
pour les modèles ONNX. - Pour en savoir plus sur les convertisseurs ONNX disponibles et les tutoriels, consultez la page Convertir au format ONNX.
- Pour obtenir plus d'informations sur BigQuery ML, consultez la page Présentation de BigQuery ML.
- Pour commencer à utiliser BigQuery ML, consultez la page Créer des modèles de machine learning dans BigQuery ML.
Pour en savoir plus sur les autorisations IAM dans BigQuery, consultez Autorisations IAM.
(Facultatif) Entraîner un modèle et le convertir au format ONNX
Les exemples de code suivants vous montrent comment importer un modèle de classification préentraîné dans PyTorch et comment convertir le modèle obtenu au format ONNX. Ce tutoriel utilise un exemple de modèle prédéfini stocké à l'emplacement
gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx
. Vous n'avez pas besoin de suivre ces étapes si vous utilisez l'exemple de modèle.Créer un modèle PyTorch Vision pour la classification d'images
Utilisez l'exemple de code suivant pour importer un modèle resnet18 pré-entraîné PyTorch qui accepte les données d'image décodées renvoyées par les fonctions BigQuery ML
ML.DECODE_IMAGE
etML.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() )
Convertir le modèle au format ONNX
Utilisez l'exemple suivant pour exporter le modèle de vision PyTorch à l'aide de torch.onnx. Le fichier ONNX exporté est nommé
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
Importer le modèle ONNX dans Cloud Storage
Après avoir enregistré votre modèle, procédez comme suit :
Créer un ensemble de données
Créez un ensemble de données BigQuery pour stocker votre modèle de ML.
Console
bq
Pour créer un ensemble de données, exécutez la commande
bq mk
en spécifiant l'option--location
. Pour obtenir la liste complète des paramètres possibles, consultez la documentation de référence sur la commandebq mk --dataset
.API
Appelez la méthode
datasets.insert
avec une ressource d'ensemble de données définie.{ "datasetReference": { "datasetId": "bqml_tutorial" } }
BigQuery DataFrames
Avant d'essayer cet exemple, suivez les instructions de configuration pour BigQuery DataFrames du guide de démarrage rapide de BigQuery DataFrames. Pour en savoir plus, consultez la documentation de référence sur BigQuery DataFrames.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer les ADC pour un environnement de développement local.
Importer le modèle ONNX dans BigQuery
Les étapes suivantes vous expliquent comment importer l'exemple de modèle ONNX depuis Cloud Storage dans votre ensemble de données à l'aide d'une instruction
CREATE MODEL
.Console
bq
Pour en savoir plus sur l'importation de modèles ONNX dans BigQuery, y compris sur les exigences en matière de format et de stockage, consultez la page Instruction
CREATE MODEL
pour l'importation de modèles ONNX.Créer une table d'objets dans BigQuery pour analyser les données d'image
Une table d'objets est une table en lecture seule sur des objets de données non structurés stockés dans Cloud Storage. Les tables d'objets vous permettent d'analyser des données non structurées à partir de BigQuery.
Dans ce tutoriel, vous allez utiliser la fonction
ML.PREDICT
pour afficher le libellé de classe prédit d'une image d'entrée stockée dans un bucket Cloud Storage.Pour créer la table d'objets, vous devez effectuer les opérations suivantes :
Créer un bucket et importer une image
Pour créer un bucket Cloud Storage et y importer une image de poisson rouge, procédez comme suit :
Console
Ligne de commande
Saisissez la commande
gcloud storage buckets create
suivante :gcloud storage buckets create gs://bqml_images --location=us
Si la requête aboutit, la commande renvoie le message suivant :
Creating gs://bqml_images/...
Importer une image dans votre bucket Cloud Storage
Une fois le bucket créé, téléchargez une image de poisson rouge et importez-la dans votre bucket Cloud Storage.
Pour importer l'image, procédez comme suit :
Console
Ligne de commande
Saisissez la commande
gcloud storage cp
suivante :gcloud storage cp OBJECT_LOCATION gs://bqml_images/IMAGE_NAME
Remplacez les éléments suivants :
Si l'opération réussit, la réponse se présente comme suit :
Completed files 1/1 | 164.3kiB/164.3kiB
Créer une connexion à une ressource cloud BigQuery
Vous devez disposer d'une connexion à une ressource cloud pour vous connecter à la table d'objets que vous créerez plus loin dans ce tutoriel.
Les connexions aux ressources Cloud vous permettent d'interroger des données stockées en dehors de BigQuery dans des services Google Cloud tels que Cloud Storage ou Spanner, ou dans des sources tierces telles qu'AWS ou Azure. Ces connexions externes utilisent l'API BigQuery Connection.
Pour créer votre connexion à une ressource Cloud, procédez comme suit.
Console
bq
Configurer l'accès à la connexion
Attribuez le rôle "Administrateur des objets de l'espace de stockage" au compte de service de la connexion à la ressource cloud. Vous devez accorder ce rôle dans le projet dans lequel vous avez créé le point de terminaison du modèle distant.
Pour accorder le rôle, procédez comme suit :
Créer la table d'objets
Procédez comme suit pour créer une table d'objets nommée
goldfish_image_table
à l'aide de l'image du poisson rouge que vous avez importée dans Cloud Storage.Console
bq
Pour en savoir plus, consultez Créer des tables d'objets.
Effectuer des prédictions à l'aide du modèle ONNX importé
Vous utilisez la requête suivante, qui contient la fonction
ML.PREDICT
, pour effectuer des prédictions à partir des données d'image de la table d'objets d'entréegoldfish_image_table
. Cette requête génère le libellé de classe prédit de l'image d'entrée en fonction du dictionnaire des libellés ImageNet.Dans la requête, la fonction
ML.DECODE_IMAGE
est nécessaire pour décoder les données d'image afin qu'elles puissent être interprétées parML.PREDICT
. La fonctionML.RESIZE_IMAGE
est appelée pour redimensionner l'image en fonction de la taille de l'entrée du modèle (224 x 224).Pour en savoir plus sur l'exécution d'inférences sur les tables d'objets image, consultez Exécuter des inférences sur les tables d'objets image.
Pour générer des prédictions à partir de vos données d'image, procédez comme suit.
Console
bq
Saisissez la commande
bq query
suivante :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))'
Effectuer un nettoyage
Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.
Supprimer le projet
Console
gcloud
Supprimer des ressources individuelles
Vous pouvez également supprimer les ressources individuelles utilisées dans ce tutoriel :
Étapes suivantes
- BigQuery Studio Admin (
Rôles requis
Si vous créez un projet, vous en êtes le propriétaire et vous disposez de toutes les autorisations IAM (Identity and Access Management) requises pour suivre ce tutoriel.
Si vous utilisez un projet existant, procédez comme suit.