Haz predicciones con modelos de scikit-learn en formato ONNX

Descripción general

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

  • Entrenar un modelo con tu framework favorito.
  • Convertir el modelo al formato de modelo ONNX. Para obtener más información, consulta Convierte al formato ONNX.
  • Importar el modelo ONNX a BigQuery y hacer predicciones con BigQuery ML.

En este instructivo, se muestra cómo importar modelos ONNX entrenados con scikit-learn a un conjunto de datos de BigQuery y usarlos para realizar predicciones a partir de una consulta de SQL. Puedes importar modelos de ONNX con estas interfaces:

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

Objetivos

En este instructivo, podrás:

  • Crear y entrenar modelos con scikit-learn.
  • Convertir los modelos al formato ONNX mediante sklearn-onnx.
  • Importar los modelos de ONNX a BigQuery y hacer predicciones.

Entrena un modelo de clasificación con scikit-learn

Crea y entrena una canalización de scikit-learn en el conjunto de datos de 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)

Convierte el modelo al formato ONNX y guarda

Usa sklearn-onnx para convertir la canalización de scikit-learn en un modelo de 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())

Sube el modelo ONNX a Cloud Storage.

Crea un bucket de Cloud Storage para almacenar el archivo del modelo ONNX y, luego, sube el archivo del modelo ONNX guardado a tu bucket de Cloud Storage. Para obtener más información, consulta Sube objetos desde un sistema de archivos.

Importa el modelo ONNX a BigQuery

En este paso, se supone que subiste el modelo ONNX a tu bucket de Cloud Storage. Un modelo de ejemplo se almacena en gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx.

Consola

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

    Ir a la página de BigQuery

  2. En el editor de consultas, ingresa una declaración CREATE MODEL como la siguiente.

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

    Por ejemplo:

     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 consulta anterior importa el modelo de ONNX ubicado en gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx como un modelo de BigQuery llamado imported_onnx_model.

  3. Tu nuevo modelo ahora debería aparecer en el panel Recursos. A medida que expandes cada uno de los conjuntos de datos en un proyecto, se enumeran los modelos junto con los otros recursos de BigQuery en los conjuntos de datos. Los modelos se indican con el ícono del modelo: ícono del modelo.

  4. Si seleccionas el modelo nuevo en el panel Recursos, la información sobre el modelo aparece debajo del Editor de consultas.

    Información del modelo de Onnx

bq

Para importar un modelo de ONNX desde Cloud Storage, ejecuta una consulta por lotes mediante un comando como el siguiente:

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

Por ejemplo:

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')"

Después de importar el modelo, debe aparecer en el resultado de bq ls [dataset_name]:

$ bq ls example_dataset

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

API

Inserta un nuevo trabajo y propaga la propiedad jobs#configuration.query como en el cuerpo de la solicitud siguiente:

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

Realiza predicciones con el modelo ONNX importado

Consola

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

    Ir a la página de BigQuery

  2. En el editor de consultas, ingresa una consulta con ML.PREDICT como la que se muestra a continuación.

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

    La consulta anterior usa el modelo llamado imported_onnx_model en el conjunto de datos example_dataset en el proyecto actual para realizar predicciones a partir de datos de entrada en la tabla pública iris del conjunto de datos ml_datasets en el proyecto bigquery-public-data. En este caso, el modelo ONNX espera cuatro entradas de número de punto flotante: sepal_length, sepal_width, petal_length, petal_width, que coinciden con el initial_types definido en el paso. 2, por lo que la subconsulta SELECT hace toda la tabla bigquery-public-data que contiene estas 4 columnas de entrada.

    El modelo genera las columnas label y probabilities, así como las columnas de la tabla de entrada.

    • label representa la etiqueta de clase prevista.
    • probabilities es un arreglo de probabilidades que representan probabilidades para cada clase.

    El resultado de la consulta es similar al siguiente:

    Resultados de la consulta

bq

Para realizar predicciones a partir de datos de entrada en la tabla input_data, ingresa un comando como el siguiente con el modelo de ONNX importado my_model:

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

Por ejemplo:

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

Inserta un nuevo trabajo y propaga la propiedad jobs#configuration.query como en el cuerpo de la solicitud siguiente:

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

¿Qué sigue?