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

Ce tutoriel vous explique comment importer un modèle Open Neural Network Exchange (ONNX) entraîné avec scikit-learn. Vous importez le modèle dans un ensemble de données BigQuery et l'utilisez pour effectuer des prédictions à l'aide d'une requête SQL.

ONNX fournit un format uniforme conçu pour représenter tous les frameworks de machine learning (ML). La compatibilité de BigQuery ML avec ONNX vous permet d'effectuer les opérations suivantes :

  • 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

Objectifs

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 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 entraîner un modèle de classification avec scikit-learn et comment convertir le pipeline 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/pipeline_rf.onnx. Vous n'avez pas besoin de suivre ces étapes si vous utilisez l'exemple de modèle.

Entraîner un modèle de classification à l'aide de scikit-learn

Utilisez l'exemple de code suivant pour créer et entraîner un pipeline scikit-learn sur l'ensemble de données Iris. Pour savoir comment installer et utiliser scikit-learn, consultez le guide d'installation de scikit-learn.

import numpy
from sklearn.datasets import load_iris
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier

data = load_iris()
X = data.data[:, :4]
y = data.target

ind = numpy.arange(X.shape[0])
numpy.random.shuffle(ind)
X = X[ind, :].copy()
y = y[ind].copy()

pipe = Pipeline([('scaler', StandardScaler()),
                ('clr', RandomForestClassifier())])
pipe.fit(X, y)

Convertir le pipeline en modèle ONNX

Utilisez l'exemple de code suivant dans sklearn-onnx pour convertir le pipeline scikit-learn en un modèle ONNX nommé pipeline_rf.onnx.

from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType

# Disable zipmap as it is not supported in BigQuery ML.
options = {id(pipe): {'zipmap': False}}

# Define input features. scikit-learn does not store information about the
# training dataset. It is not always possible to retrieve the number of features
# or their types. That's why the function needs another argument called initial_types.
initial_types = [
   ('sepal_length', FloatTensorType([None, 1])),
   ('sepal_width', FloatTensorType([None, 1])),
   ('petal_length', FloatTensorType([None, 1])),
   ('petal_width', FloatTensorType([None, 1])),
]

# Convert the model.
model_onnx = convert_sklearn(
   pipe, 'pipeline_rf', initial_types=initial_types, options=options
)

# And save.
with open('pipeline_rf.onnx', 'wb') as f:
 f.write(model_onnx.SerializeToString())

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"
  }
}

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.

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

Importer le modèle ONNX dans BigQuery

Les étapes suivantes vous montrent comment importer l'exemple de modèle ONNX depuis Cloud Storage à l'aide d'une instruction CREATE MODEL.

Pour importer le modèle ONNX dans votre ensemble de données, sélectionnez l'une des options suivantes :

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/pipeline_rf.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 le modèle d'exemple, remplacez BUCKET_PATH par la valeur suivante : gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx.

    Une fois l'opération terminée, un message semblable à celui-ci s'affiche : Successfully created model named imported_onnx_model.

  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

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.

Importez le modèle à l'aide de l'objet ONNXModel.

import bigframes
from bigframes.ml.imported import ONNXModel

bigframes.options.bigquery.project = PROJECT_ID
# You can change the location to one of the valid locations: https://cloud.google.com/bigquery/docs/locations#supported_locations
bigframes.options.bigquery.location = "US"

imported_onnx_model = ONNXModel(
    model_path="gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx"
)

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.

Effectuer des prédictions à l'aide du modèle ONNX importé

Après avoir importé le modèle ONNX, vous utilisez la fonction ML.PREDICT pour effectuer des prédictions avec le modèle.

La requête des étapes suivantes utilise imported_onnx_model pour effectuer des prédictions à l'aide des données d'entrée de la table iris dans l'ensemble de données public ml_datasets. Le modèle ONNX s'attend à quatre valeurs FLOAT en entrée :

  • sepal_length
  • sepal_width
  • petal_length
  • petal_width

Ces entrées correspondent aux initial_types qui ont été définis lorsque vous avez converti le modèle au format ONNX.

Les sorties incluent les colonnes label et probabilities, ainsi que les colonnes de la table d'entrée. label représente l'étiquette de classe prédite. probabilities est un tableau de probabilités représentant les probabilités de chaque classe.

Pour effectuer des prédictions à l'aide du modèle ONNX importé, choisissez l'une des options suivantes :

Console

  1. Accédez à la page BigQuery Studio.

    Accéder à BigQuery Studio

  2. Dans l'éditeur de requête, saisissez la requête qui utilise la fonction ML.PREDICT.

    SELECT *
      FROM ML.PREDICT(MODEL `bqml_tutorial.imported_onnx_model`,
        (
        SELECT * FROM `bigquery-public-data.ml_datasets.iris`
        )
    )

    Les résultats de la requête sont semblables à ceux-ci :

    Résultat de la requête ML.PREDICT

bq

Exécutez la requête qui utilise ML.PREDICT.

bq query --use_legacy_sql=false \
'SELECT *
FROM ML.PREDICT(
MODEL `example_dataset.imported_onnx_model`,
(SELECT * FROM `bigquery-public-data.ml_datasets.iris`))'

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.

Utilisez la fonction predict pour exécuter le modèle ONNX.

import bigframes.pandas as bpd

df = bpd.read_gbq("bigquery-public-data.ml_datasets.iris")
predictions = imported_onnx_model.predict(df)
predictions.peek(5)

Le résultat ressemble à ce qui suit :

Sortie de la fonction de prédiction

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.

Étapes suivantes