Effectuer des prédictions à l'aide de modèles PyTorch au format ONNX

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 suivants de Google Cloud :

Pour obtenir une estimation des coûts en fonction de votre utilisation prévue, utilisez le simulateur de coût.

Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai sans frais.

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

  1. Connectez-vous à votre compte Google Cloud . Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits sans frais pour exécuter, tester et déployer des charges de travail.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  4. Vérifiez que la facturation est activée pour votre projet Google Cloud .

  5. Activez les API BigQuery, BigQuery Connection et Cloud Storage.

    Rôles requis pour activer les API

    Pour activer les API, vous avez besoin du rôle IAM Administrateur Service Usage (roles/serviceusage.serviceUsageAdmin), qui contient l'autorisation serviceusage.services.enable. Découvrez comment attribuer des rôles.

    Activer les API

  6. Assurez-vous de disposer des autorisations nécessaires pour effectuer les tâches décrites dans ce document.

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.

Assurez-vous de disposer du ou des rôles suivants sur le projet :

Vérifier les rôles

  1. Dans la console Google Cloud , accédez à la page IAM.

    Accéder à IAM
  2. Sélectionnez le projet.
  3. Dans la colonne Compte principal, recherchez toutes les lignes qui vous identifient ou identifient un groupe dont vous faites partie. Pour savoir à quels groupes vous appartenez, contactez votre administrateur.

  4. Pour toutes les lignes qui vous spécifient ou vous incluent, consultez la colonne Rôle pour vous assurer que la liste inclut les rôles requis.

Attribuer les rôles

  1. Dans la console Google Cloud , accédez à la page IAM.

    Accéder à IAM
  2. Sélectionnez le projet.
  3. Cliquez sur  Accorder l'accès.
  4. 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.

  5. Cliquez sur Sélectionner un rôle, puis recherchez le rôle.
  6. Pour attribuer des rôles supplémentaires, cliquez sur  Ajouter un autre rôle et ajoutez tous les rôles supplémentaires.
  7. Cliquez sur Enregistrer.

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 et ML.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

  1. Dans la console Google Cloud , accédez à la page BigQuery.

    Accéder à la page "BigQuery"

  2. Dans le volet Explorateur, cliquez sur le nom de votre projet.

  3. Cliquez sur Afficher les actions > Créer un ensemble de données.

  4. 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 États-Unis.

    • Conservez les autres paramètres par défaut, puis cliquez sur Créer un ensemble de données.

bq

Pour créer un ensemble de données, utilisez la commande bq mk --dataset.

  1. Créez un ensemble de données nommé bqml_tutorial et définissez l'emplacement des données sur US.

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. Vérifiez que l'ensemble de données a été créé :

    bq ls

API

Appelez la méthode datasets.insert avec une ressource d'ensemble de données définie.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

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

  1. Dans la console Google Cloud , accédez à la page BigQuery Studio.

    Accéder à BigQuery Studio

  2. 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, remplacez BUCKET_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 : Icône du modèle dans le panneau "Ressources". 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.

    Panneau d'informations pour `imported_onnx_model`.

bq

  1. 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, remplacez BUCKET_PATH par cette valeur : gs://cloud-samples-data/bigquery/ml/onnx/resnet18.onnx.

  2. Une fois le modèle importé, vérifiez qu'il apparaît dans l'ensemble de données.

    bq ls -m bqml_tutorial

    Le résultat ressemble à ce qui suit :

    tableId               Type
    --------------------- -------
    imported_onnx_model  MODEL

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é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.

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

  1. Dans la console Google Cloud , accédez à la page Buckets de Cloud Storage.

    Accéder à la page Buckets

  2. Cliquez sur  Créer.

  3. Sur la page Créer un bucket, saisissez les informations concernant votre bucket.

    1. Dans la section Premiers pas, procédez comme suit :

      1. Dans la zone de texte, saisissez bqml_images.

      2. Cliquez sur Continuer.

    2. Dans la section Choisir l'emplacement de stockage de vos données, procédez comme suit :

      1. Dans le champ Type d'emplacement, sélectionnez Multirégional.

      2. Dans le menu du type d'emplacement, sélectionnez US (plusieurs régions aux États-Unis).

      3. Cliquez sur Continuer.

    3. Dans la section Choisir une classe de stockage pour vos données :

      1. Sélectionnez Définir une classe par défaut.

      2. Sélectionnez Standard.

      3. Cliquez sur Continuer.

    4. Conservez les valeurs par défaut dans les autres sections.

  4. Cliquez sur Créer.

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

  1. Dans la console Google Cloud , accédez à la page Buckets de Cloud Storage.

    Accéder à la page "Buckets"

  2. Dans la liste des buckets, cliquez sur bqml_images.

  3. Dans l'onglet Objets du bucket, effectuez l'une des opérations 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.

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 :

  • OBJECT_LOCATION : chemin d'accès local à votre fichier image. Exemple :Desktop/goldfish.jpg
  • IMAGE_NAME : nom de l'image. Exemple : goldfish.jpg.

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

  1. Accédez à la page BigQuery Studio.

    Accéder à BigQuery Studio

  2. Dans le volet de gauche, cliquez sur Explorateur :

    Bouton du volet Explorateur mis en évidence.

    Si le volet de gauche ne s'affiche pas, cliquez sur Développer le volet de gauche pour l'ouvrir.

  3. Dans le volet Explorateur, cliquez sur  Ajouter des données.

    La boîte de dialogue Ajouter des données s'ouvre.

  4. Dans le panneau 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.

  5. Dans la section Sources de données recommandées, cliquez sur Vertex AI.

  6. Cliquez sur la carte de solution Vertex AI Models: BigQuery Federation (Vertex AI : Fédération BigQuery).

  7. Dans la liste Type de connexion, sélectionnez Modèles distants Vertex AI, fonctions distantes et BigLake (ressource Cloud).

  8. Dans le champ ID de connexion, saisissez bqml_tutorial.

  9. Vérifiez que l'option Multirégional – États-Unis est sélectionnée.

  10. Cliquez sur Créer une connexion.

  11. En bas de la fenêtre, cliquez sur Accéder à la connexion. Vous pouvez également cliquer sur Connexions dans le volet Explorateur, puis sur us.bqml_tutorial.

  12. Dans le volet Informations de connexion, copiez l'ID du compte de service. Vous en aurez besoin pour configurer les autorisations de 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.

bq

  1. 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 du 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...
    
  2. 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"}
    

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 aux ressources Cloud. Vous devez accorder ce rôle dans le projet dans lequel vous avez importé les fichiers image.

Pour accorder le rôle, procédez comme suit :

  1. Accédez à la page IAM et administration.

    Accéder à IAM et administration

  2. Cliquez sur Accorder l'accès.

  3. Dans le champ Nouveaux comptes principaux, saisissez l'ID du compte de service de la connexion à la ressource cloud que vous avez copié précédemment.

  4. Dans le champ Sélectionner un rôle, sélectionnez Cloud Storage, puis Administrateur des objets Storage.

  5. Cliquez sur Enregistrer.

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 de poisson rouge que vous avez importée dans Cloud Storage.

Console

  1. Accédez à la page BigQuery Studio.

    Accéder à BigQuery Studio

  2. Dans l'éditeur de requête, 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 exemple goldfish.jpg.

    Une fois l'opération terminée, un message semblable à This statement created a new table named goldfish_image_table s'affiche.

bq

  1. 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 exemple goldfish.jpg.

  2. 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

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ée goldfish_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 par ML.PREDICT. La fonction ML.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

  1. Accédez à la page BigQuery Studio.

    Accéder à BigQuery Studio

  2. 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 :

    Résultats de la requête ML.PREDICT

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

  1. Dans la console Google Cloud , accédez à la page Gérer les ressources.

    Accéder à la page "Gérer les ressources"

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

gcloud

    Supprimer un projet Google Cloud  :

    gcloud projects delete PROJECT_ID

Supprimer des ressources individuelles

Vous pouvez également supprimer les ressources individuelles utilisées dans ce tutoriel :

  1. Supprimez le modèle importé.

  2. (Facultatif) Supprimez l'ensemble de données.

  3. Supprimez la connexion de ressource Cloud.

  4. Supprimer le bucket Cloud Storage.

Étapes suivantes