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

Présentation

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 (pour en savoir plus, consultez la section Convertir 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 scikit-learn dans un ensemble de données BigQuery et les utiliser pour effectuer des prédictions à partir d'une requête SQL. Vous pouvez importer des modèles ONNX à l'aide des interfaces suivantes :

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.

Objectifs

Au cours de ce tutoriel, vous allez :

  • créer et entraîner des modèles avec scikit-learn ;
  • convertir les modèles au format ONNX à l'aide de sklearn-onnx ;
  • importer les modèles ONNX dans BigQuery et effectuer des prédictions.

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

Créez et entraînez un pipeline scikit-learn sur l'ensemble de données Iris :

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 modèle au format ONNX et l'enregistrer

Utilisez 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

Créez un bucket Cloud Storage pour stocker le fichier de modèle ONNX, puis importez le fichier de modèle ONNX enregistré dans votre bucket Cloud Storage. Pour en savoir plus, consultez la page Importer des objets à partir d'un système de fichiers.

Importer le modèle ONNX dans BigQuery

Cette étape suppose que vous avez importé le modèle ONNX dans votre bucket Cloud Storage. Un exemple de modèle est stocké à l'emplacement gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx.

Console

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

    Accéder à BigQuery

  2. Dans l'éditeur de requêtes, saisissez l'instruction CREATE MODEL suivante :

     CREATE OR REPLACE MODEL `mydataset.mymodel`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='gs://bucket/path/to/onnx_model/*')
    

    Exemple :

     CREATE OR REPLACE MODEL `example_dataset.imported_onnx_model`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx')
    

    La requête précédente importe le modèle ONNX situé à l'emplacement gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx en tant que modèle BigQuery nommé imported_onnx_model.

  3. Votre nouveau modèle devrait désormais s'afficher dans le panneau Ressources. À mesure que vous développez chacun des ensembles de données d'un projet, les modèles sont répertoriés avec les autres ressources BigQuery des ensembles de données. Les modèles sont indiqués par l'icône icône de modèle.

  4. Si vous sélectionnez le nouveau modèle dans le panneau Ressources, les informations relatives au modèle s'affichent sous l'éditeur de requête.

    informations sur le modèle onnx

bq

Pour importer un modèle ONNX à partir de Cloud Storage, exécutez une requête par lot en saisissant une commande semblable à la suivante :

bq query \
--use_legacy_sql=false \
"CREATE MODEL
  `mydataset.mymodel`
OPTIONS
  (MODEL_TYPE='ONNX',
   MODEL_PATH='gs://bucket/path/to/onnx_model/*')"

Exemple :

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/pipeline_rf.onnx')"

Une fois le modèle importé, il doit apparaître dans le résultat de la requête bq ls [dataset_name] :

$ bq ls example_dataset

       tableId          Type    Labels   Time Partitioning
 --------------------- ------- -------- -------------------
  imported_onnx_model   MODEL

API

Insérez une nouvelle tâche et renseignez la propriété jobs#configuration.query comme dans le corps de la requête suivante :

{
  "query": "CREATE MODEL project_id:mydataset.mymodel OPTIONS(MODEL_TYPE='ONNX' MODEL_PATH='gs://bucket/path/to/onnx_model/*')"
}

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

Console

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

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez une requête à l'aide de ML.PREDICT comme ceci :

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

    La requête précédente utilise le modèle nommé imported_onnx_model dans l'ensemble de données example_dataset du projet en cours pour effectuer des prédictions à partir des données d'entrée de la table publique iris de l'ensemble de données ml_datasets du projet bigquery-public-data. Dans ce cas, le modèle ONNX attend quatre entrées flottantes : sepal_length, sepal_width, petal_length et petal_width qui correspondent à l'entrée initial_types définie à l'étape 2. La sous-requête SELECT interroge donc l'ensemble de la table bigquery-public-data contenant ces quatre colonnes d'entrée.

    Le modèle génère 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.

    Le résultat de la requête se présente comme suit :

    Résultats de la requête

bq

Pour effectuer des prédictions à partir des données d'entrée de la table input_data, saisissez une commande comme suit, à l'aide du modèle ONNX importé my_model :

bq query \
--use_legacy_sql=false \
'SELECT *
 FROM ML.PREDICT(
   MODEL `my_project.my_dataset.my_model`,
   (SELECT * FROM input_data))'

Exemple :

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

API

Insérez une nouvelle tâche et renseignez la propriété jobs#configuration.query comme dans le corps de la requête suivante :

{
  "query": "SELECT * FROM ML.PREDICT(MODEL `my_project.my_dataset.my_model`, (SELECT * FROM input_data))"
}

Étapes suivantes