Hacer predicciones con modelos de scikit-learn en formato ONNX

En este tutorial se muestra cómo importar un modelo Open Neural Network Exchange (ONNX) entrenado con scikit-learn. Importa el modelo a un conjunto de datos de BigQuery y úsalo para hacer predicciones con una consulta SQL.

ONNX proporciona un formato uniforme diseñado para representar cualquier framework de aprendizaje automático (ML). La compatibilidad de BigQuery ML con ONNX te permite hacer lo siguiente:

  • Entrena un modelo con tu framework favorito.
  • Convierte el modelo al formato ONNX.
  • Importa el modelo ONNX a BigQuery y haz predicciones con BigQuery ML.

Opcional: Entrenar un modelo y convertirlo al formato ONNX

En los siguientes ejemplos de código se muestra cómo entrenar un modelo de clasificación con scikit-learn y cómo convertir la canalización resultante al formato ONNX. En este tutorial se usa un modelo de ejemplo precompilado que se almacena en gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx. No es necesario que completes estos pasos si utilizas el modelo de ejemplo.

Entrenar un modelo de clasificación con scikit-learn

Usa el siguiente código de ejemplo para crear y entrenar una pipeline de scikit-learn en el conjunto de datos Iris. Para obtener instrucciones sobre cómo instalar y usar scikit-learn, consulta la guía de instalación 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 la canalización en un modelo ONNX

Usa el siguiente código de ejemplo en sklearn-onnx para convertir la canalización de scikit-learn en un modelo ONNX llamado 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())

Subir el modelo ONNX a Cloud Storage

Después de guardar el modelo, haz lo siguiente:

Crear conjunto de datos

Crea un conjunto de datos de BigQuery para almacenar tu modelo de aprendizaje automático.

Consola

  1. En la Cloud de Confiance consola, ve a la página BigQuery.

    Ir a la página de BigQuery

  2. En el panel Explorador, haz clic en el nombre de tu proyecto.

  3. Haga clic en Ver acciones > Crear conjunto de datos.

  4. En la página Crear conjunto de datos, haz lo siguiente:

    • En ID del conjunto de datos, introduce bqml_tutorial.

    • En Tipo de ubicación, selecciona Multirregión y, a continuación, EE. UU. (varias regiones de Estados Unidos).

    • Deje el resto de los ajustes predeterminados como están y haga clic en Crear conjunto de datos.

bq

Para crear un conjunto de datos, usa el comando bq mk con la marca --location. Para ver una lista completa de los parámetros posibles, consulta la referencia del comando bq mk --dataset.

  1. Crea un conjunto de datos llamado bqml_tutorial con la ubicación de los datos definida como US y la descripción BigQuery ML tutorial dataset:

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    En lugar de usar la marca --dataset, el comando usa el acceso directo -d. Si omite -d y --dataset, el comando creará un conjunto de datos de forma predeterminada.

  2. Confirma que se ha creado el conjunto de datos:

    bq ls

API

Llama al método datasets.insert con un recurso de conjunto de datos definido.

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

BigQuery DataFrames

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

import google.cloud.bigquery

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

Importar el modelo ONNX a BigQuery

En los pasos siguientes se muestra cómo importar el modelo ONNX de ejemplo desde Cloud Storage mediante una instrucción CREATE MODEL.

Para importar el modelo ONNX al conjunto de datos, selecciona una de las siguientes opciones:

Consola

  1. En la Cloud de Confiance consola, ve a la página BigQuery Studio.

    Ir a BigQuery Studio

  2. En el editor de consultas, introduce la siguiente instrucción CREATE MODEL.

     CREATE OR REPLACE MODEL `bqml_tutorial.imported_onnx_model`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='BUCKET_PATH')

    Sustituye BUCKET_PATH por la ruta al modelo que has subido a Cloud Storage. Si utilizas el modelo de ejemplo, sustituye BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx.

    Cuando la operación se haya completado, verás un mensaje similar al siguiente: Successfully created model named imported_onnx_model.

    El nuevo modelo aparecerá en el panel Recursos. Los modelos se indican con el icono de modelo: Icono de modelo en el panel Recursos Si selecciona el nuevo modelo en el panel Recursos, aparecerá información sobre el modelo junto al editor de consultas.

    Panel de información de `imported_onnx_model`

bq

  1. Importa el modelo ONNX de Cloud Storage introduciendo la siguiente instrucción 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')"

    Sustituye BUCKET_PATH por la ruta al modelo que has subido a Cloud Storage. Si utilizas el modelo de ejemplo, sustituye BUCKET_PATH por el siguiente valor: gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx.

    Cuando la operación se haya completado, verás un mensaje similar al siguiente: Successfully created model named imported_onnx_model.

  2. Después de importar el modelo, comprueba que aparece en el conjunto de datos.

    bq ls -m bqml_tutorial

    El resultado debería ser similar al siguiente:

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

BigQuery DataFrames

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

Importa el modelo mediante el objeto 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"
)

Para obtener más información sobre cómo importar modelos ONNX a BigQuery, incluidos los requisitos de formato y almacenamiento, consulta la sentencia CREATE MODEL para importar modelos ONNX.

Hacer predicciones con el modelo ONNX importado

Después de importar el modelo ONNX, usa la función ML.PREDICT para hacer predicciones con el modelo.

La consulta de los siguientes pasos usa imported_onnx_model para hacer predicciones con datos de entrada de la tabla iris del conjunto de datos público ml_datasets. El modelo ONNX espera cuatro valores FLOAT como entrada:

  • sepal_length
  • sepal_width
  • petal_length
  • petal_width

Estas entradas coinciden con las initial_types que se definieron cuando convirtió el modelo al formato ONNX.

Los resultados incluyen las columnas label y probabilities, así como las columnas de la tabla de entrada. label representa la etiqueta de clase predicha. probabilities es una matriz de probabilidades que representa las probabilidades de cada clase.

Para hacer predicciones con el modelo ONNX importado, elige una de las siguientes opciones:

Consola

  1. Ve a la página BigQuery Studio.

    Ir a BigQuery Studio

  2. En el editor de consultas, introduce esta consulta que usa la función ML.PREDICT.

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

    Los resultados de la consulta son similares a los siguientes:

    El resultado de la consulta ML.PREDICT

bq

Ejecuta la consulta que usa 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

Antes de probar este ejemplo, sigue las instrucciones de configuración de BigQuery DataFrames que se indican en la guía de inicio rápido de BigQuery con BigQuery DataFrames. Para obtener más información, consulta la documentación de referencia de los DataFrames de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar ADC en un entorno de desarrollo local.

Usa la función predict para ejecutar el modelo 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)

El resultado es similar al siguiente:

El resultado de la función predict